in reply to Re: foreach skipping elements
in thread foreach skipping elements

"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

Replies are listed 'Best First'.
Re^3: foreach skipping elements
by mtmcc (Hermit) on Jul 20, 2013 at 05:25 UTC
    Fair point, thanks for comparing them!

    Michael