2015-01-06 3 views
1

Я только что прочитал около \Q и \E, и я пытаюсь полностью их выполнить. не Согласно perlre:Что такое Q в Perl? Всегда ли нужно использовать E?

\ Q кавычки (отключить) модель метасимволы до \ E

\ E конец либо случай изменения или цитируемый раздела, думаю VI

Так что я сделал пару тестов :

$ perl -e 'print "hello\n" if "he\\tllo" =~ /\Q\t/' 
hello 
$ perl -e 'print "hello\n" if "he\\tllo" =~ /\t/' 
$ 

Если я понимаю правильно, без \Q он не оценивает, как правда потому, что он жулик siders \t в качестве вкладки.

Тогда я использовал \E и я не вижу никакой разницы:

$ perl -e 'print "hello\n" if "he\\tllo" =~ /\Q\t\E/' 
hello 

Если я дам более широкую строку и структуру, содержащую как буквальное \t и ушко:

$ perl -e 'print "hello\n" if "he\\tl\tlo" =~ /\Q\t\E.*\t/' 
hello 

Это похоже на работу, потому что он считает первый \t фиксированной строкой, тогда как второй \t считается вкладкой.

Так должно использоваться \Q и \E? То есть мы прилагаем «чистые» строки между \Q и \E? Правильно ли использовать \Q, если все должно рассматриваться как буквальное?

ответ

4

\E обозначает конец, а не только \Q, но другие escape-последовательности, такие как \U. Таким образом, вы будете использовать его, когда вам понадобится последовательность \Q. Но я думаю, что ты слишком задумываешься. \Q - это версия выхода quotemeta().

"(foobar" =~ /\Q(fo+bar/ # false, "+" gets escaped 
"(foobar" =~ /\Q(\Efo+bar/ # true 

Я бы не сказал, что «следует использовать». Если вы не используете \E, то \Q продолжается по всему вашему рисунку.

Более ощутимый способ понять, как работает \E, чтобы использовать его с \U:

$ perl -lwe' print "\Ufoobar" ' 
FOOBAR 
$ perl -lwe' print "\Ufoo\Ebar" ' 
FOObar 
1

Окончательный \E не нужен, если ничего опасного не следует за ним. Я не уверен, что это поведение задокументировано, но я видел это много раз.

Это также интересно посмотреть, как интерполяция переменных играет с \Q:

perl -E '$x = "lo\$"; say "hello" =~ /$x/' 
1 

perl -E '$x = "lo\$"; say "hello" =~ /\Q$x/' 

#^
# | empty line here. 

Смотрите также quotemeta.

+0

Довольно интересно. Когда вы говорите «если ничего опасного не следует», оно всегда находится в рамках шаблона, соответствующего '/ $ x /', правильно? – fedorqui

+1

@fedorqui: Точно. – choroba

+0

@fedorqui, Собственно, нет. Внутри литералов регулярных выражений и строковых литералов с двойной кавычкой. – ikegami

2

Так же, как "abc $x def" такая же, как "abc ".$x." def"

$ diff -u0 \ 
    <(perl -MO=Concise,-exec -E'$_ = "abc $x def";'  2>&1) \ 
    <(perl -MO=Concise,-exec -E'$_ = "abc ".$x." def";' 2>&1) \ 
     && echo "same" 
same 

"abc \Q$x\t\E def" так же, как "abc ".quotemeta($x."\t")." def"

$ diff -u0 \ 
    <(perl -MO=Concise,-exec -E'$_ = "abc \Q$x\t\E def";'    2>&1) \ 
    <(perl -MO=Concise,-exec -E'$_ = "abc ".quotemeta($x."\t")." def";' 2>&1) \ 
     && echo "same" 
--- /dev/fd/63 2015-01-06 11:22:49.564061341 -0500 
+++ /dev/fd/62 2015-01-06 11:22:49.564061341 -0500 
@@ -7,3 +7,3 @@ 
-6 <2> concat[t3] sK/2 
-7 <1> quotemeta[t4] sK/1 
-8 <2> concat[t5] sK/2 
+6 <2> concat[t4] sK/2 
+7 <1> quotemeta[t5] sK/1 
+8 <2> concat[t6] sK/2 
@@ -11 +11 @@ 
-a <2> concat[t6] sKS/2 
+a <2> concat[t7] sKS/2 

(разница лишь разница в индексах в «подушку», массив где хранятся лексические файлы.)

Его также можно использовать в литералах регулярного выражения.

my $exact_text = "..."; 
my $pat = quotemeta($exact_text); 
if (/$pat/) { ... } 

давно для

my $exact_text = "..."; 
if (/\Q$exact_text\E/) { ... } 

\E может быть опущена, если она находится в конце литерала.

my $exact_text = "..."; 
if (/\Q$exact_text/) { ... } 
+0

Отлично, поэтому '\ Q ... \ E' совпадает с' quotemeta (...) '. Это не совсем то, что я просил (на самом деле я обнаружил существование 'quotemeta' из ответов на этот вопрос), но это довольно ценная информация, которую я предполагаю в какой-то день я буду использовать :) Большое спасибо и +1! – fedorqui

+0

Добавлен '\ t' в пример. – ikegami

+0

Re «Это не совсем то, что я просил». Вы имеете в виду, я не ответил «Так ли это, как использовать' \ Q' и '\ E'?"? Зависит от того, чего вы хотите. Если вы используете его, чтобы делать то, что хотите, вы используете его так, как он должен использоваться. – ikegami

Смежные вопросы