in reply to Re^2: Determing if this regex matched
in thread Determing if this regex matched

For the elegant method, try perlretut (and family), "Mastering Regular Expressions," Tutorials, perhaps.

But -- IMO -- "elegant" is frequently overrated; the real question, I think, is "does it work, consistently?"

Replies are listed 'Best First'.
Re^4: Determing if this regex matched
by cormanaz (Deacon) on Aug 06, 2011 at 20:34 UTC
    Well good point.

    I still wonder why is $& always null in the original example.

      ... why is $& always null in the original example.

      I think the answer is that $ (in the original example) and \z (in the example below) match after the last character in the string: that's the 'position' of the end of the string. For instance, in the string 'xa' the 'a' can match and is replaced, but after this match the match position (as returned by pos) is just beyond the end of the string, where it can match once again with no 'a', no whitespace and \z — a zero-length match!

      >perl -wMstrict -le "my @strings = ('x', 'xa', 'x ', 'xa ',); ;; for my $s (@strings) { $s =~ s{ a? \s* \z } { print qq{\$& '$&' pos = }, pos($s); ''; }xmseg; print qq{\$s '$s' \n}; } " $& '' pos = 1 $s 'x' $& 'a' pos = 1 $& '' pos = 2 $s 'x' $& ' ' pos = 1 $& '' pos = 2 $s 'x' $& 'a ' pos = 1 $& '' pos = 3 $s 'x'

      Update: N.B.: The /g regex modifier does not act to 'reset' $&, $1, or other match variables.