in reply to /s and /m don't seem to be doing anything

Don't forget the basic debugging step of printing your things to check if they are what you think they are:

my $re1=qr/foo$/; my $re2=qr/foo$/m; my $re3=qr/foo$/s; $,="\t"; $\="\n"; # just for output print qr/$re1/, qr/$re1/m, qr/$re1/s; print qr/$re2/, qr/$re2/m, qr/$re2/s; print qr/$re3/, qr/$re3/m, qr/$re3/s; __END__ (?^:foo$) (?^:foo$) (?^:foo$) (?^m:foo$) (?^m:foo$) (?^m:foo$) (?^s:foo$) (?^s:foo$) (?^s:foo$)

So that means...

my $re1=qr/foo$/; print $re1, "\n"; print "foo\\nbar\\n =~ \/$re1\/ \t"; print "foo\nbar\n" =~ /$re1/ ?"true":"false"; print "\n"; print "foo\\nbar\\n =~ \/$re1\/m \t"; print "foo\nbar\n" =~ /$re1/m ?"true":"false"; print "\n"; my $re2=qr/foo$/m; print $re2, "\n"; print "foo\\nbar\\n =~ \/$re2\/ \t"; print "foo\nbar\n" =~ /$re2/ ?"true":"false"; print "\n"; print "foo\\nbar\\n =~ \/$re2\/m \t"; print "foo\nbar\n" =~ /$re2/m ?"true":"false"; print "\n"; __END__ (?^:foo$) foo\nbar\n =~ /(?^:foo$)/ false foo\nbar\n =~ /(?^:foo$)/m false (?^m:foo$) foo\nbar\n =~ /(?^m:foo$)/ true foo\nbar\n =~ /(?^m:foo$)/m true

(I haven't yet found the relevant bit of documentation that makes this behavior clear.)

Replies are listed 'Best First'.
Re^2: /s and /m don't seem to be doing anything
by Anonymous Monk on Dec 31, 2014 at 04:24 UTC
Re^2: /s and /m don't seem to be doing anything
by Anonymous Monk on Dec 31, 2014 at 04:25 UTC

    Combining this with LanX's comment about metachars gives enlightenment:

    my $re1=qr/foo$/; my $re2=qr/foo$/m; $,="\t"; $\="\n"; # just for output print tf(qr/$re1/), tf(qr/$re1/m); print tf(qr/$re1$/), tf(qr/$re1$/m); print tf(qr/$re2/), tf(qr/$re2/m); print tf(qr/$re2$/), tf(qr/$re2$/m); sub tf { "$_[0] ".("foo\nbar\n"=~$_[0]?"T":"F") } __END__ (?^:foo$) F (?^:foo$) F (?^:(?^:foo$)$) F (?^m:(?^:foo$)$) F (?^m:foo$) T (?^m:foo$) T (?^:(?^m:foo$)$) F (?^m:(?^m:foo$)$) T

    i.e. the modifiers need to be on the regex which contains the metacharacters which they affect. Makes sense but I didn't catch it right away.

    perlop says this:

    If a precompiled pattern is embedded in a larger pattern then the effect of "msixpluad" will be propagated appropriately.

    It's possible I've missed some other documentation, but I find this statement possibly a bit misleading, since "appropriately" could be taken to mean that, for example, qr/$re1/m should propagate /m into $re1, as the OP expected.

      I can't test but I'm sure including $re as string w/o precompiling doesn't preserve any flags.

      Cheers Rolf

      (addicted to the Perl Programming Language and ☆☆☆☆ :)

        If a regex is defined in string form, then no regex modifiers are associated with it unless they happen to be explicitly embedded within the string using a  (?adlupimsx-imsx) or  (?adluimsx-imsx:pattern) construct (see Extended Patterns in perlre).

        c:\@Work\Perl\monks>perl -wMstrict -le "my $rs1 = '(?:(?-s).*)'; ;; my $rx1 = qr{ ($rs1) (.*) }xms; print qq{\$rx1: $rx1}; ;; qq{foo\nBAR} =~ m{ $rx1 }xms; print qq{from \$rx1: \$1 '$1' \$2 '$2'}; ;; my $rs2 = '(?:.*)'; ;; my $rx2 = qr{ ($rs2) (.*) }xms; print qq{\$rx2: $rx2}; ;; qq{wig\nWAG} =~ m{ $rx2 }xms; print qq{from \$rx2: \$1 '$1' \$2 '$2'}; " $rx1: (?^msx: ((?:(?-s).*)) (.*) ) from $rx1: $1 'foo' $2 ' BAR' $rx2: (?^msx: ((?:.*)) (.*) ) from $rx2: $1 'wig WAG' $2 ''


        Give a man a fish:  <%-(-(-(-<