"fix bug; also prefix ?? matches with m due to 5.14 deprecation"
authorTom Christiansen <tchrist@perl.com>
Mon, 9 May 2011 02:42:54 +0000 (22:42 -0400)
committerJesse Vincent <jesse@bestpractical.com>
Mon, 9 May 2011 02:43:53 +0000 (22:43 -0400)
I also fixed a bug in the original.  I'm always getting C<eof> vs C<eof()>
swapped in my brain, which is what had happened here.  The old code didn't
do what it said it did because it contrary to the comments didn't reset at
each eof -- because it used the C<eof()> form which is all of ARGV rather
than bare C<eof> for the last file read, and thus each per-file component
of ARGV.

I am concerned about the two paragraphs previous to that, because they
use eof() and I am not perfectly clear that they should.  But I left
them as is.

Jesse asked for "a lot of eyes", so if folks could please look at this
patch and see whether it looks ok, I'd appreciate it.  I did test it
under blead, both with and without the prefixed m on the m?? matches,
which is how I discovered it was buggy with the C<eof()> not C<eof>.

--tom

pod/perlsyn.pod

index 33eb4ae..603dd15 100644 (file)
@@ -337,17 +337,17 @@ which is Perl short-hand for the more explicitly written version:
 Note that if there were a C<continue> block on the above code, it would
 get executed only on lines discarded by the regex (since redo skips the
 continue block). A continue block is often used to reset line counters
-or C<?pat?> one-time matches:
+or C<m?pat?> one-time matches:
 
     # inspired by :1,$g/fred/s//WILMA/
     while (<>) {
-       ?(fred)?    && s//WILMA $1 WILMA/;
-       ?(barney)?  && s//BETTY $1 BETTY/;
-       ?(homer)?   && s//MARGE $1 MARGE/;
+       m?(fred)?    && s//WILMA $1 WILMA/;
+       m?(barney)?  && s//BETTY $1 BETTY/;
+       m?(homer)?   && s//MARGE $1 MARGE/;
     } continue {
        print "$ARGV $.: $_";
-       close ARGV  if eof();           # reset $.
-       reset       if eof();           # reset ?pat?
+       close ARGV  if eof;             # reset $.
+       reset       if eof;             # reset ?pat?
     }
 
 If the word C<while> is replaced by the word C<until>, the sense of the