"You could stick spaces into those 'empty' bars by swapping with something like this: while($line =~ s/\|\|/\| \|/){}"
Perhaps I'm missing your intent, but that seems like an unnecessarily complicated way to get a repeat substitution when the 'g' modifier is provided for that task:
$ perl -Mstrict -Mwarnings -E ' my $x = q{1|2|3|||6|7||||}; { my $line = $x; while($line =~ s/\|\|/\| \|/){} say $line; } { my $line = $x; $line =~ s/\|(?=\|)/| /g; say $line; } ' 1|2|3| | |6|7| | | | 1|2|3| | |6|7| | | |
Using the while loop instead of the 'g' modifier is also slower:
$ perl -Mstrict -Mwarnings -E ' use Benchmark qw{cmpthese}; my $x = q{1|2|3|||6|7||||}; cmpthese(1e6 => { while_no_repeat => sub { my $line = $x; while($line =~ s/\|\|/\| \|/){} }, just_repeat => sub { my $line = $x; $line =~ s/\|(?=\|)/| /g; } }); ' Rate while_no_repeat just_repeat while_no_repeat 158479/s -- -21% just_repeat 201613/s 27% --
[Aside: the pipe (|) character is not special in the "replacement" part of s/pattern/replacement/ so there's no need to escape it.]
-- Ken
In reply to Re^2: foreach skipping elements
by kcott
in thread foreach skipping elements
by tiggyboo
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |