Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

This regex surprised me

by szabgab (Priest)
on Aug 13, 2014 at 16:51 UTC ( #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 (Archbishop) 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

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1097316]
Approved by Athanasius
Front-paged by sweetblood
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (5)
As of 2022-08-08 22:17 GMT
Find Nodes?
    Voting Booth?

    No recent polls found