Использовал ли $ иногда совпадение с новой строкой в ​​Perl? - PullRequest
0 голосов
/ 12 августа 2010

Кажется, я помню, что были определенные условия, при которых $ соответствовал бы новой строке (не "непосредственно перед"), но я не могу найти ничего в документах, подтверждающих это. Это использовалось, чтобы быть правдой в более ранней версии Perl, или я сплю?

Ответы [ 4 ]

5 голосов
/ 12 августа 2010

Так было всегда. См. perldoc perlreref ($ является якорем):

$ Соответствует концу строки (или строке, если используется /m) или перед новой строкой

Вам следует использовать \z, если вы хотите сопоставить конец строки:

\z Соответствует абсолютному концу строки

3 голосов
/ 12 августа 2010

Вы путаете две очень похожие вещи.$ соответствует в конце строки, если /m не используется, и в конце строки или в конце строки, за исключением последнего перевода строкиесли /m используется.Однако на самом деле не соответствует (потребляет) саму новую строку.Вы все еще можете сопоставить сам символ новой строки с чем-то другим в регулярном выражении, например \n;или, если вы также используете /s, то /blah$./sm теоретически будет соответствовать "бла \ n", даже если $ не является последним в регулярном выражении.

(Причина, по которой это не такна самом деле работа заключается в том, что и $., и $\ фактически интерпретируются как специальные переменные, а не как $ плюс ., так что на самом деле довольно сложно поместить что-то после $ в регулярное выражениене так ли?)

3 голосов
/ 12 августа 2010

Если вы передаете модификатор /s в регулярное выражение, то $ соответствует концу строки и позволяет . соответствовать \n.

Это может немного сбить с толку.Для строки foo\n обратите внимание на разницу между:

/.$/ # matches 'o'

/.$/s # still matches 'o'

/.+$/s # matches 'foo\n'

/.\z/ # doesn't match at all

/.\z/s # matches '\n'

1 голос
/ 12 августа 2010

При добавлении модификатора 'm' $ будет соответствовать (но не потреблять) концу строки символов.Обычно '$' соответствует концу строки .

my $sample = "first\nsecond\nthird";
$sample =~ s/$/END/mg;
print $sample;

Производит:

firstEND
secondEND
thirdEND

Если вы хотите потреблять символ новой строки, простоиспользуйте escape-символ \ n:

my $sample = "first\nsecond\nthird";
$sample =~ s/\n/END/g;
print $sample;

Теперь вы получите:

firstENDsecondENDthird

Обратите внимание, что модификатор 'm' также влияет на '^' так же, как и '$'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...