URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9184
[ Назад ]

Исходное сообщение
"perl: затык с регекспом"

Отправлено ACCA , 07-Июл-11 18:11 
Что-то я затупил... Почему Wans находится, а Mans нет??


while (<DATA>) {
    print "=== Mans\n"          if m'I\/Ians';
    print "=== Wans\n"          if m'\/Vans';
}

__DATA__
I\/Ians
\/Vans

На всякий случай:
$ perl -v

This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi


Содержание

Сообщения в этом обсуждении
"perl: затык с регекспом"
Отправлено XAnder , 07-Июл-11 19:48 
Тонкости интерпретации. В начале выражение в одинарных кавычках читается как лексема языка (то есть в нашем случае буквально), а потом полученная строка обрабатывается интерпретатором регулярных выражений, который понятия не имеет, какие там были кавычки — не его это дело.

'\/' — это интерпретатор понимает как «символ /»

'I\/Ians' — а это, соответственно, как «символы I / I a n s»

В этом нетрудно убедиться, дописав в секцию __DATA__ строчку «I/Ians»

Вообще же, советую по возможности избегать конструкций вида m'...', используя более привычные m/.../ или m{...}.


"perl: затык с регекспом"
Отправлено ACCA , 07-Июл-11 20:58 
> Тонкости интерпретации. В начале выражение в одинарных кавычках читается как лексема [...]
> Вообще же, советую по возможности избегать конструкций вида m'...', используя более
> привычные m/.../ или m{...}.

Про одинарные кавычки perlre говорит, что RE будет восприниматься буквально, переменные не раскрываются. Для того они там и поставлены. К сожалению ни звука про \.

Переформулирую вопрос - можно ли заставить m// воспринимать \ буквально, как это всегда происходит со всякими \}?


"perl: затык с регекспом"
Отправлено XAnder , 08-Июл-11 08:59 
> Переформулирую вопрос - можно ли заставить m// воспринимать \ буквально, как это
> всегда происходит со всякими \}?

Можно: m/a\\b/ соответствует строке «a\b», но не «a\\b»


"perl: затык с регекспом"
Отправлено Etch , 08-Июл-11 09:02 
> Переформулирую вопрос - можно ли заставить m// воспринимать \ буквально, как это
> всегда происходит со всякими \}?

m/\\/;
?