Подтвердить что ты не робот

Что именно означает $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).

Итак, что именно (и при каких обстоятельствах) соответствует атому $?

4b9b3361

Ответ 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) на всех существующих платформах.