ocehb: (Default)
[personal profile] ocehb
"по форматной строке вида "Я [сразу|немедленно] [пошёл|поехал|пополз|попёрся] разбираться с [делами|братками]." сгенерировать полный список всех возможных вариантов такой строки"



my @ary = map { m#\[(.+?)\]# ? [ split "\\|",$1 ] : $_ } split "\\s+",$ARGV[0];
print join "\n",map { join " ",@$_ } shuffle (@ary);

exit;

sub shuffle (@) {
    my $word = shift or return;
    my @ary;
    foreach my $w (ref $word eq "ARRAY" ? @$word : $word) {
	foreach my $s (@_ ? shuffle (@_) : undef) {
	    push @ary,[ $w,defined ($s) && @$s ];
	}
    }
    return @ary;
}

Date: 2007-03-21 10:49 am (UTC)
From: [identity profile] jerom.livejournal.com
А зачем возня с ref .. eq "ARRAY"? сделай просто [ $_ ] в первой строке и всё.

А на скорость плевать, как обычно :-)

Date: 2007-03-21 10:51 am (UTC)
From: [identity profile] jerom.livejournal.com
+ ты теряешь знаки препинания

Date: 2007-03-22 07:49 pm (UTC)
From: [identity profile] gone-one.livejournal.com
Черт, ну нельзя вечером такие вещи подкидывать ;))
my $pattern = "Я [сразу|немедленно] [пошёл|поехал|пополз|попёрся] разбираться с [делами|братками].\n";
print mutate($pattern);

sub mutate {{s/\[([^]|]*)\|?([^]]*)\]/$2&&push@_,$`."[$2]$'";$1/e||return@_ for@_;redo}}


Или в виде stdin-фильтра:
#!/usr/bin/perl -n
@_=$_;Z:{s/\[([^]|]*)\|?([^]]*)\]/$2&&push@_,$`."[$2]$'";$1/e||print(@_)&&last Z for@_;redo}

Profile

ocehb: (Default)
ocehb

January 2021

S M T W T F S
     12
345 6789
10111213141516
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 6th, 2026 02:24 am
Powered by Dreamwidth Studios