Для строки "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
<