in reply to Re: Seeking Audience with the Perl Regex Droids...
in thread Seeking Audience with the Perl Regex Droids...

Your solution is actually incorrect on parsing any string which has a consecutive stretch of pound signs (ie '#') that is a multiple of 4 and greater than or equal to 8.

Try this:
my $x = '@########@';
it should parse as:
'', '####', '',
Your solution (as you've hard coded it for one example, and admittedly so in your post), returns:
'', '###@'
which would have been delimited as:
'@#######@'
That is, seven pound signs...

I ask you to please consider the original post as I dont think you are making your assertions with an understanding of what was asked. For example, the escape character itself must be escaped when created a delimited line. Hence the list:
my @x = qw(## @ #);
would be delimited as:
'####@#@@##'
Finally, I would be glad to verify your second claim if you can provide the input string upon which rollahead and unroll return different results. I believe such a string does not exist.

Replies are listed 'Best First'.
Re^3: Seeking Audience with the Perl Regex Droids...
by BrowserUk (Patriarch) on Mar 29, 2008 at 09:04 UTC
    Finally, I would be glad to verify your second claim if you can provide the input string upon which rollahead and unroll return different results. I believe such a string does not exist.

    Actually, it was your own benchmark:

    #! perl -slw use strict; use Benchmark ':all', ':hireswallclock'; my $x = "#@##@###@####@#####@"; my $y = reverse $x; my $z = "$x$x$x$y$y$x$x$y$y$y$y$y$x$x$x$x"; our %results; cmpthese -3, { unroll => sub { my @x = ([unroll($x)],[unroll($y)],[unroll($z)]); $results{ unroll } = \@x; }, rollahead => sub { my @x = ([rollahead($x)],[rollahead($y)],[rollahead($z)]); $results{ rollahead } = \@x; }, lookbehind => sub { my @x = ([lookbehind($x)],[lookbehind($y)],[lookbehind($z)]); $results{ lookbehind } = \@x; }, }; printf "%20s => %s\n", $_, "@{[ map{ qq[@$_] } @{ $results{ $_ } } ]} +" for keys %results; sub unroll { my @x = $_[0] =~ /(?:^|@)((?:##|#@|[^#@])*)/g; for(@x){ $_ =~ s/##/#/g; $_ =~ s/#@/@/g; } @x } sub rollahead { my $x = shift; $x = reverse $x; my @x = reverse(split/\@(?=(?:##)*(?!#))/,$x,-1); for(@x){ $_ = reverse; $_ =~ s/##/#/g; $_ =~ s/#@/@/g; } @x } sub lookbehind { my $x = shift; split m[ (?: (?<=[^#]\#\#\#\#) | (?<=[^#]\#\#) | (?<!\#) ) [@] ]x, + $x; }

    Output (read'em and weep:):

    C:\test>junk8 Rate unroll rollahead lookbehind unroll 3096/s -- -3% -33% rollahead 3175/s 3% -- -32% lookbehind 4639/s 50% 46% -- rollahead => @# #@## ##@ ##@## #@# # @# #@## ##@@# #@## ## +@@# #@## ##@ ##@## #@# @##@## #@# # # #@## ##@@# #@## ##@ ##@## #@# @ +##@## #@# @##@## #@# @##@## #@# @##@## #@# # # #@## ##@@# #@## ##@@# +#@## ##@@# #@## ##@ unroll => @# #@## ##@ ##@## #@# @# #@## ##@@# #@## ##@ +@# #@## ##@ ##@## #@# @##@## #@# # # #@## ##@@# #@## ##@ ##@## #@# @# +#@## #@# @##@## #@# @##@## #@# @##@## #@# # # #@## ##@@# #@## ##@@# # +@## ##@@# #@## ##@ lookbehind => #@## ###@#### #####@ #####@#### ###@## # #@## + ###@#### #####@#@## ###@#### #####@#@## ###@#### #####@ #####@#### # +##@## #@#####@#### ###@## ## ## ###@#### #####@#@## ###@#### #####@ # +####@#### ###@## #@#####@#### ###@## #@#####@#### ###@## #@#####@#### + ###@## #@#####@#### ###@## ## ## ###@#### #####@#@## ###@#### #####@ +#@## ###@#### #####@#@## ###@#### #####@

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.