Не совсем понял причем тут модификатор "s". Модификатор "s" просто говорит перлу интерпретировать ".", как абсолютно любой символ(включая перевод строки).
Опечатки не было :). Меня просто смущает то, что
print 1 if "a\n" =~ /^a\n$/m; # выведет 1, а print 1 if "a\nb" =~ /^a\n$/m; # не выведет 1
Попадает :). Илья хороший пример навел print 1 if "a\n\nb" =~ /^a\n$/m;
По мне логичней, чтобы всегда "$" вел себя как маркер позиции(вроде как \b). А то получается, что в некоторых случаях это просто позиция, а в некоторых - символ перевода строки(хотя перевод строки можно всегда записать как "\n").
Почему если "^" - это всегда исключительно всегда позиция в начале строки(print 1 if "a\nb" =~ /\n^b$/m;), то "$" - может вести себя по разному?!
Хотел написать ответ но потом понял, что есть повод снова почитать Фрилда на тему многострочных строк и переводов строки, так как действительно непонятно.
все верно, $ означает позицию в конце строки, в твоем случае, /^a\n$/m движок регулярных выражений после символа "a" проходит конец строки "\n", а затем видит метасимвол $, а так как конец строки уже пройден а следующий еще не достигнут(до которого нужно пройти символ "b"), то естественно шаблон не соответствует строке. Я почему то уверен, что говоря /^a\n$/m, ты хотел сказать /^a$\n/m
$ это конец либо строки либо всего текста если есть мультистрочный флаг, в первом случае \n в него не входит, а во втором \n есть в тексте но "a\nb" =~ /^a\n$/m; не сработает потому что там еще есть b после \n
15 коммент.:
/^a$/m же.
Потому, что если не стоит модификатор s каждый разрыв строки считается концом строки. а по поводу /^a\n$/m это я так понимаю опечатка?
$ perl -e 'print 1 if "a\nb" =~ /^a$/m;'
1
$ perl -e 'print 1 if "a\nb" =~ /^a\n$/m;'
(единицу не печатает)
Не совсем понял причем тут модификатор "s". Модификатор "s" просто говорит перлу интерпретировать ".", как абсолютно любой символ(включая перевод строки).
Опечатки не было :).
Меня просто смущает то, что
print 1 if "a\n" =~ /^a\n$/m; # выведет 1, а
print 1 if "a\nb" =~ /^a\n$/m; # не выведет 1
Не могу понять логики происходящего. Почему такое поведение логично?
Видимо потому, что при использовании модификатора /m после символа \n должен быть конец строки - т.е. символ \n или совсем конец строки.
В первом случае это работает, во втором - нет, т.к. там не конец строки, а буква "b".
print 1 if "a\n\nb" =~ /^a\n$/m; - работает
Наверное, потому что \n - попадает в $
Вот так единичка получится:
print 1 if "a\nb" =~ /^a$/m;
Попадает :). Илья хороший пример навел
print 1 if "a\n\nb" =~ /^a\n$/m;
По мне логичней, чтобы всегда "$" вел себя как маркер позиции(вроде как \b). А то получается, что в некоторых случаях это просто позиция, а в некоторых - символ перевода строки(хотя перевод строки можно всегда записать как "\n").
Почему если "^" - это всегда исключительно всегда позиция в начале строки(print 1 if "a\nb" =~ /\n^b$/m;), то "$" - может вести себя по разному?!
Хотел написать ответ но потом понял, что
есть повод снова почитать Фрилда на тему многострочных строк и переводов строки, так как действительно непонятно.
> Модификатор "s" просто говорит перлу интерпретировать ".", как абсолютно любой символ(включая перевод строки).
Не только. Ещё при "s" \n попадает в \s.
Ну да,
"ab" =~ /ab$/m выдает 1.
Что и удобнее, чем просто \n юзать
2friday
>Не только. Ещё при "s" \n попадает в \s.
"\n" всегда попадает в "\s", независимо от того используем ли мы модификатор "s"
все верно, $ означает позицию в конце строки, в твоем случае,
/^a\n$/m
движок регулярных выражений после символа "a" проходит конец строки "\n", а затем видит метасимвол $, а так как конец строки уже пройден а следующий еще не достигнут(до которого нужно пройти символ "b"), то естественно шаблон не соответствует строке.
Я почему то уверен, что говоря /^a\n$/m, ты хотел сказать /^a$\n/m
говоря короче $ - позиция перед "\n", а не после него
2zhdinar: именно! :) спасибо. А то я тут сам на ровном месте запутался и остальных запутал.
$ это конец либо строки либо всего текста если есть мультистрочный флаг, в первом случае \n в него не входит, а во втором \n есть в тексте но "a\nb" =~ /^a\n$/m; не сработает потому что там еще есть b после \n
Отправить комментарий
Не забудьте добавить себя в постоянные читатели и включить уведомления о новых комментариях, либо воспользуйтесь RSS каналом ;)