Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

This regex surprised me

by szabgab (Priest)
on Aug 13, 2014 at 16:51 UTC ( [id://1097316] : perlquestion . print w/replies, xml ) Need Help??

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

In this snippet it looks like the /m modifier does not modify a regex if it came from a pre-compiled regex. (4th print is 0). If I am not mistaken this was not always like this. I think in 5.8.x the 4th print still printed 1. Can you confirm this? Can someone point me to the explanation of this?
use strict; use warnings; my $str = "x\nab\ny"; my $re = '^ab$'; print $str =~ /$re/ ? 1 : 0, "\n"; # 0 print $str =~ /$re/m ? 1 : 0, "\n"; # 1 my $qre = qr/^ab$/; print $str =~ /$qre/ ? 1 : 0, "\n"; # 0 print $str =~ /$qre/m ? 1 : 0, "\n"; # 0 but I think 5.8.x still had + this as 1


Thanks for all the responses and links!

Replies are listed 'Best First'.
Re: This regex surprised me
by Athanasius (Archbishop) on Aug 13, 2014 at 17:17 UTC

    Printing the pre-compiled regex, I get:

    3:05 >perl -wE "my $q = qr/^ab$/; say $q;" (?^u:^ab$) 3:06 >

    and from perlre#Extended-Patterns it appears that this is equivalent to (?ud-imsx:^ab$), which explicitly turns off the m modifier throughout of the embeded pattern-match modifier. So adding /m to the regex has no effect, because it is overridden within the (?-m:...) construct inside the regex.

    I don’t know how all this worked in earlier versions of Perl, but in recent versions, it seems you have to add the /m modifier when the regex is first constructed using qr//:

    my $qre = qr/^ab$/m;

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Re: This regex surprised me
by AppleFritter (Vicar) on Aug 13, 2014 at 18:45 UTC

    This is documented in perl5101delta, under "Other Incompatible Changes":

    This one is actually a change introduced in 5.10.0, but it was missed from that release's perldelta, so it is mentioned here instead.

    A bugfix related to the handling of the /m modifier and qr resulted in a change of behaviour between 5.8.x and 5.10.0:

    # matches in 5.8.x, doesn't match in 5.10.0 $re = qr/^bar/; "foo\nbar" =~ /$re/m;
Re: This regex surprised me
by choroba (Cardinal) on Aug 13, 2014 at 18:32 UTC
    Confirmed: on 5.8.3 and 5.8.5, I'm getting 0101, on 5.10.1, I'm getting 0100.
    لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: This regex surprised me ( qr//m, perldeltas, perlcritic )
by Anonymous Monk on Aug 13, 2014 at 21:34 UTC