什么是\ Q in Perl?是否总是需要使用\ E?

时间:2015-01-06 10:47:08

标签: perl

我刚刚阅读了\Q\E,我正在努力全力以赴。根据{{​​3}}:

  

\ 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,则不会将其评估为True,因为它会将\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的方式吗?也就是说,我们附上" clean" \Q\E之间的字符串?如果所有内容都应被视为文字,那么使用\Q是否正确?

3 个答案:

答案 0 :(得分:4)

\E标志着\Q的结束,而不是其他转义,例如\U。因此,当您需要\Q序列结束时,您将使用它。但我认为你是在过度思考。 \Qquotemeta()的转义版本。

"(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 :(得分: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

(差异只是&#34; pad&#34;中的索引的差异,即存储词法的数组。)

它也可以在regexp文字中使用。

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/) { ... }

答案 2 :(得分:1)

如果没有任何危险,则不需要最终\E。我不确定这种行为是否有记录,但我已多次见过它。

看看变量插值如何与\Q一起使用也很有趣:

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

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

# ^
# | empty line here.

另见quotemeta