Rather than iterating through every permutation of every comma-separated sub-phrase, wouldn't it be better to print each set of sub-phrases once per line? Also, comma-separated sub-phrases at the beginning or end of the line will not be processed. How about something like:
c:\@Work\Perl\monks>perl -wMstrict -le
"my @lines = (
'some text foo | some text BAR | oh , no , commas | some text BAZ |
+ some text QUX',
'some text Oof | some, text, BAR | some , text , BAZ | some text QU
+X',
'some, text, FOO | some text BAR | one two | some , text , QUX',
);
;;
my $got_commas = qr{
(?: (?<= [|]) | \A) [^|,]* (?: , [^|,]*)+ (?= [|] | \z)
}xms;
;;
for my $line (@lines) {
while ($line =~ m{ ($got_commas) }xmsg) {
my $before = substr $line, 0, $-[1];
my $after = substr $line, $+[1];
print qq{:$before$_$after:} for split m{ , }xms, $1;
}
}
"
:some text foo | some text BAR | oh | some text BAZ | some text QUX:
:some text foo | some text BAR | no | some text BAZ | some text QUX:
:some text foo | some text BAR | commas | some text BAZ | some text QU
+X:
:some text Oof | some| some , text , BAZ | some text QUX:
:some text Oof | text| some , text , BAZ | some text QUX:
:some text Oof | BAR | some , text , BAZ | some text QUX:
:some text Oof | some, text, BAR | some | some text QUX:
:some text Oof | some, text, BAR | text | some text QUX:
:some text Oof | some, text, BAR | BAZ | some text QUX:
:some| some text BAR | one two | some , text , QUX:
: text| some text BAR | one two | some , text , QUX:
: FOO | some text BAR | one two | some , text , QUX:
:some, text, FOO | some text BAR | one two | some :
:some, text, FOO | some text BAR | one two | text :
:some, text, FOO | some text BAR | one two | QUX:
(Availability of \K with Perl versions 5.10+ can make the (?: (?<= [|]) | \A)) expression a little nicer.)
Update: An "impure" variation. No big improvement; maybe of some interest.
c:\@Work\Perl\monks>perl -wMstrict -le
"my @lines = (
'some text foo | some text BAR | oh , no , commas | some text BAZ |
+ some text QUX',
'some text Oof | some, text, BAR | some , text , BAZ | some text QU
+X',
'some, text, FOO | some text BAR | one two | some , text , QUX',
);
;;
my $got_commas = qr{
(?: (?<= [|]) | \A) [^|,]* (?: , [^|,]*)+ (?= [|] | \z)
}xms;
;;
local our @out;
use re 'eval';
m{ \A (.*?) ($got_commas) (?= (.*))
(?{ push @out, map qq{>$1$_$3<}, split m{ , }xms, $2 })
(?!)
}xmsg
for @lines;
;;
print for @out;
"
>some text foo | some text BAR | oh | some text BAZ | some text QUX<
>some text foo | some text BAR | no | some text BAZ | some text QUX<
>some text foo | some text BAR | commas | some text BAZ | some text QU
+X<
>some text Oof | some| some , text , BAZ | some text QUX<
>some text Oof | text| some , text , BAZ | some text QUX<
>some text Oof | BAR | some , text , BAZ | some text QUX<
>some text Oof | some, text, BAR | some | some text QUX<
>some text Oof | some, text, BAR | text | some text QUX<
>some text Oof | some, text, BAR | BAZ | some text QUX<
>some| some text BAR | one two | some , text , QUX<
> text| some text BAR | one two | some , text , QUX<
> FOO | some text BAR | one two | some , text , QUX<
>some, text, FOO | some text BAR | one two | some <
>some, text, FOO | some text BAR | one two | text <
>some, text, FOO | some text BAR | one two | QUX<
Give a man a fish: <%-{-{-{-<
|