http://www.perlmonks.org?node_id=1000227

clueless newbie has asked for the wisdom of the Perl Monks concerning the following question:

While the following code works, it offends me because the regex on the line marked with #!!!!! captures only a single line and I'd prefer to capture everything up to the next Smart Comment. Where's my "misteak?"

#!/usr/bin/perl use Data::Dumper; use strict; use warnings; use v5.10; local $/; my $code_s=<DATA>; while ($code_s !~ m{\G$}cg) { if ($code_s =~ m{\G^(\s*###+.*\n)}cgm) { # $1 is a Smart Comment upto and including the \n warn Data::Dumper->Dump([\$1],[qw(*1)]).' '; # Since the \n was captured we don't need to bump pos($cod +e_s) #pos($code_s)++; } elsif ($code_s =~ m{\G((?:.*$)*)(?!\s*###+)}cgm) { #!!!!! # $1 only captures a single line # why not multiple lines complete with their \n? warn Data::Dumper->Dump([\$1],[qw(*1)]).' '; pos($code_s)++; } else { my $pos=pos($code_s); my $residue=substr($code_s,$pos); die 'WTF:\n'.Data::Dumper->Dump([\$pos,\$residue],[qw(*pos + *residue)]); }; }; exit; __END__ no ### yes # ### no no no #### yes

yields

$1 = \'no'; at Parse.pl line 20, <DATA> chunk 1. $1 = \' ### yes '; at Parse.pl line 14, <DATA> chunk 1. $1 = \' # ### no'; at Parse.pl line 20, <DATA> chunk 1. $1 = \'no '; at Parse.pl line 20, <DATA> chunk 1. $1 = \'no '; at Parse.pl line 20, <DATA> chunk 1. $1 = \' #### yes '; at Parse.pl line 14, <DATA> chunk 1.

Note I corrected \s###+ to \s*###+

Replies are listed 'Best First'.
Re: Regex assistance, please.
by moritz (Cardinal) on Oct 21, 2012 at 17:49 UTC

      Thank you, moritz. But changing the cgm to cgms causes $1 on the marked line to capture everything including the "Smart Comments"