Что именно означает $match в Perl?
До нескольких минут назад я считал, что Perl $
соответствует любому типу конца строки. К сожалению, мое предположение оказывается неправильным.
Следующий script удаляет конец слова только для $string3
.
use warnings;
use strict;
my $string1 = " match to the end" . chr(13);
my $string2 = " match to the end" . chr(13) . chr(10);
my $string3 = " match to the end" . chr(10);
$string1 =~ s/ end$//;
$string2 =~ s/ end$//;
$string3 =~ s/ end$//;
print "$string1\n";
print "$string2\n";
print "$string3\n";
Но я почти на 75% уверен, что видел случаи, когда $
соответствует не менее chr(13).chr(10)
.
Итак, что именно (и при каких обстоятельствах) соответствует атому $
?
Ответы
Ответ 1
$
соответствует только позиции до \n
/chr(10)
и не раньше \r
/chr(13)
.
Это очень часто неверно интерпретируется, чтобы соответствовать перед символом newline
(во многих случаях это не вызывает проблем), но чтобы быть строгим, он соответствует перед символом "строка перевода строки , но не до символа возврата каретки!
См. Учебное пособие по регулярному выражению - начало и конец строк или линейных анкеров.
Ответ 2
Прежде всего, это зависит от того, действует ли модификатор /m
или нет.
При активном /m
он соответствует перед символом \n
или в конце строки. Это эквивалентно (?=\n|\z)
.
Без /m
он соответствует перед символом \n
, если это последний символ строки или в конце строки. Это эквивалентно (?=\n?\z)
.
Он не соответствует общей строке новой строки. Метахарактер \R
(введенный в 5.10.0) делает это (но без свойства end-of-string $
). Вы можете подставить \R
для \n
в одну из предыдущих эквивалентов, чтобы получить $
work-alike, который соответствует общей строке новой строки.
Обратите внимание, что \n
не всегда chr(10)
. Это зависит от платформы. Большинство используемых в настоящее время платформ имеют \n
значение chr(10)
, но это не всегда так. Например, на старших компьютерах Mac \n
был chr(13)
и \R
был chr(10)
.
Ответ 3
/$/
/$/m
эквивалентны
/(?=\n\z)|\z/
/(?=\n)|\z/
соответственно. \n
соответствует U + 000A (LINE FEED aka NEWLINE) на всех существующих платформах.