Перловые экзерсисы
Mar. 21st, 2007 10:43 amДля домашнего проекта поставил себе задачку: по форматной строке вида "Я [сразу|немедленно] [пошёл|поехал|пополз|попёрся] разбираться с [делами|братками]." сгенерировать полный список всех возможных вариантов такой строки. Посидел с карандашиком минут 20, наваял примерно такой код:
package Xtras::Mutator;
sub new {
my ($class,$pattern) = @_;
my $self = bless {}, $class;
$self->parse( $pattern ) if $pattern;
return $self;
}
sub parse {
my( $self, $pattern ) = @_;
$pattern =~ s/\%/%%/g;
$self->{pattern} = $pattern;
$self->{words} = [];
while( $self->{pattern} =~ s/\[(.*?)\]/%s/ )
{
push @{$self->{words}}, [ split /\|/, $1 ];
}
return $self->{words};
}
sub permutations {
return make_mutes( $_[0]->{pattern}, $_[0]->{words}, [] );
}
sub make_mutes {
my( $pat, $dict, $dat ) = @_;
return [ sprintf( $pat, @$dat ) ] unless scalar @$dict;
my @mutes = ();
my $words = shift @$dict;
push @mutes, @{ make_mutes( $pat, $dict, [ @$dat, $_ ] ) } for @$words;
unshift @$dict, $words;
return [ @mutes ];
}
Добравшись до компа, втоптал. И - заработало всего после двух исправлений. Старею видать... Надо посидеть помедитировать - можно ли всё это проще или изящнее изобразить? Всё-таки люблю я perl.
no subject
Date: 2007-03-21 09:39 am (UTC)no subject
Date: 2007-03-21 10:24 am (UTC)no subject
Date: 2007-03-21 09:41 pm (UTC)no subject
Date: 2007-03-21 10:28 am (UTC)