воскресенье, 30 мая 2010 г.

Чего я не понимаю?

print 1 if "a\nb" =~ /^a\n$/m; #Почему не выводит 1?

15 коммент.:

friday комментирует...

/^a$/m же.

Dim_K комментирует...

Потому, что если не стоит модификатор s каждый разрыв строки считается концом строки. а по поводу /^a\n$/m это я так понимаю опечатка?

$ perl -e 'print 1 if "a\nb" =~ /^a$/m;'
1
$ perl -e 'print 1 if "a\nb" =~ /^a\n$/m;'
(единицу не печатает)

koorchik комментирует...

Не совсем понял причем тут модификатор "s". Модификатор "s" просто говорит перлу интерпретировать ".", как абсолютно любой символ(включая перевод строки).

Опечатки не было :).
Меня просто смущает то, что

print 1 if "a\n" =~ /^a\n$/m; # выведет 1, а
print 1 if "a\nb" =~ /^a\n$/m; # не выведет 1

koorchik комментирует...

Не могу понять логики происходящего. Почему такое поведение логично?

Илья комментирует...

Видимо потому, что при использовании модификатора /m после символа \n должен быть конец строки - т.е. символ \n или совсем конец строки.

В первом случае это работает, во втором - нет, т.к. там не конец строки, а буква "b".

print 1 if "a\n\nb" =~ /^a\n$/m; - работает

kabanoid комментирует...

Наверное, потому что \n - попадает в $

Вот так единичка получится:
print 1 if "a\nb" =~ /^a$/m;

koorchik комментирует...

Попадает :). Илья хороший пример навел
print 1 if "a\n\nb" =~ /^a\n$/m;

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

Почему если "^" - это всегда исключительно всегда позиция в начале строки(print 1 if "a\nb" =~ /\n^b$/m;), то "$" - может вести себя по разному?!

Анонимный комментирует...

Хотел написать ответ но потом понял, что
есть повод снова почитать Фрилда на тему многострочных строк и переводов строки, так как действительно непонятно.

friday комментирует...

> Модификатор "s" просто говорит перлу интерпретировать ".", как абсолютно любой символ(включая перевод строки).

Не только. Ещё при "s" \n попадает в \s.

Анонимный комментирует...

Ну да,
"ab" =~ /ab$/m выдает 1.

Что и удобнее, чем просто \n юзать

koorchik комментирует...

2friday
>Не только. Ещё при "s" \n попадает в \s.
"\n" всегда попадает в "\s", независимо от того используем ли мы модификатор "s"

zhdinar комментирует...

все верно, $ означает позицию в конце строки, в твоем случае,
/^a\n$/m
движок регулярных выражений после символа "a" проходит конец строки "\n", а затем видит метасимвол $, а так как конец строки уже пройден а следующий еще не достигнут(до которого нужно пройти символ "b"), то естественно шаблон не соответствует строке.
Я почему то уверен, что говоря /^a\n$/m, ты хотел сказать /^a$\n/m

zhdinar комментирует...

говоря короче $ - позиция перед "\n", а не после него

koorchik комментирует...

2zhdinar: именно! :) спасибо. А то я тут сам на ровном месте запутался и остальных запутал.

Fuksito комментирует...

$ это конец либо строки либо всего текста если есть мультистрочный флаг, в первом случае \n в него не входит, а во втором \n есть в тексте но "a\nb" =~ /^a\n$/m; не сработает потому что там еще есть b после \n

Отправить комментарий

Не забудьте добавить себя в постоянные читатели и включить уведомления о новых комментариях, либо воспользуйтесь RSS каналом ;)