http://www.perlmonks.org?node_id=558521


in reply to Re^2: Regex Tool
in thread Regex Tool

Just for your interest:

Multiple ^ or $ anchors would be legal.
The /m modifier in combination with the /s modifier would match the intended behaviour.
/m: match over multiple lines
/s: . matches everything (even newlines)

Note that you would have to insert code to match any newline either by . or by \s. See example below.

my $text = <<"END"; a sample line item duhduh foo END $text =~ /^item.*(^duhduh$)\s*foo$/sm; print "\$1: '$1'\n"; # prints "$1: 'duhduh'"

Replies are listed 'Best First'.
Re^4: Regex Tool
by a (Friar) on Jul 01, 2006 at 14:22 UTC
    Just a point here - something I finally got only after a number of rereadings of the section in J. Friedl's excellent Mastering Regular Expressions (O'Reilly) the /m and /s are a little more complicated.
    /m: better remembered as 'multi' mode - affects 'multiple' (2) meta chars, the anchors (^ and $)
    /s: 'single' mode - affects one meta char, the dot '.'

    /s changes the dot's normal definition - match any char except a new line (\n). In single mode the dot can match \n too which allows regex phrases like:
    .*

    to match across the end of line. That all it does and so its why the "item.*" in your example matches the end of line.
    /m changes the ^ and $ anchors from absolute beginning and end of string to match beginning and end of a line, as marked by new line chars. Which is useful w/ the '/g' option, for example:

    local $/ = undef; my $whole_file = <>; # slurp while ( $whole_file =~ /^(.*)$/mg ) { # process line by line print "Got: $1\n"; }
    Not a useful snippet but ... two notes - the '\n' on the print stmt and notice the diff if you put an 's' in the match options

    a