Невозможно понять результат для многострочного регулярного выражения qr/ (. $.+ )/xms

Для строки "aa\nbb\ncc" я хочу сопоставить от последней буквы слева до первой новой строки ("a" )до конца многострочной строки и ожидал, что

"aa\nbb\ncc" =~ qr/(. $.+ )/xmsспичкиa\nbb\ncc

и что

"aa\nbb\ncc\n" =~ qr/(. $.+ )/xmsсоответствует a\nbb\ncc\n.

Но у меня нет ничего для "aa\nbb\ncc" =~ qr/(. $.+ )/xmsи сопоставьте c\nс "aa\nbb\ncc" =~ qr/(. $.+ )/xms.

Используя qr/(. $..+ )/xms, я получил ожидаемые результаты (, см. пример кода ).

Перл версии 5.14.2.

Кто-нибудь может объяснить такое поведение?

perldoc perlre:

   m   Treat string as multiple lines.  That is, change "^" and "$" 
       from matching the start or end of the string to matching the start 
       or end of any line anywhere within the string.

   s   Treat string as single line. That is, change "." to match any character 
       whatsoever, even a newline, which normally it would not match.

       Used together, as "/ms", they let the "." match any character whatsoever, 
       while still allowing "^" and "$" to match, respectively, just after and 
       just before ewlines within the string.

   \z  Match only at end of string

Выполнение следующего примера кода:

#!/usr/bin/env perl

use strict;
use warnings;

print "Multiline string : ", '"aa\nbb\ncc"', "\n\n";
my $str = "aa\nbb\ncc";

print_match($str, qr/(. $ )/xms);       # matches "a"
print_match($str, qr/(. $. )/xms);     # matches "a\n"
print_match($str, qr/(. $.. )/xms);    # matches "a\nb"
print_match($str, qr/(. $..+ )/xms);   # matches "a\nbb\ncc"
print_match($str, qr/(. $.+ )/xms);    # NO MATCH ! Why ???
print_match($str, qr/(. $.+ \z )/xms); # NO MATCH ! Why ???

print "\nMultiline string now with terminating newline : ", '"aa\nbb\ncc\n"', "\n\n";
$str = "aa\nbb\ncc\n";

print_match($str, qr/(. $ )/xms);       # matches "a"
print_match($str, qr/(. $. )/xms);     # matches "a\n"
print_match($str, qr/(. $.. )/xms);    # matches "a\nb"
print_match($str, qr/(. $..+ )/xms);   # matches "a\nbb\ncc\n"
print_match($str, qr/(. $.+ )/xms);    # MATCHES "c\n" ! Why ???
print_match($str, qr/(. $.+ \z)/xms);  # MATCHES "c\n" ! Why ???

sub print_match {
    my ($str, $regex) = @_;
    $str =~ $regex;
    if ( $1 ) {
        printf "--> %-20s matched : >%s< \n", $regex, $1;
    }
    else {
        printf "--> %-20s : no match !\n", $regex;
    }
}

вывод:

Multiline string : "aa\nbb\ncc"

--> (?^msx:(. $ ))      matched : >a<
--> (?^msx:(. $. ))    matched : >a
<
--> (?^msx:(. $.. ))   matched : >a
b<
--> (?^msx:(. $..+ ))  matched : >a
bb
cc<
--> (?^msx:(. $.+ ))   : no match !

Multiline string now with terminating newline : "aa\nbb\ncc\n"

--> (?^msx:(. $ ))      matched : >a<
--> (?^msx:(. $. ))    matched : >a
<
--> (?^msx:(. $.. ))   matched : >a
b<
--> (?^msx:(. $..+ ))  matched : >a
bb
cc
<
--> (?^msx:(. $.+ ))   matched : >c
<
12
задан simbabque 10 July 2012 в 13:08
поделиться