我刚刚阅读了\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
是否正确?
答案 0 :(得分:4)
\E
标志着\Q
的结束,而不是其他转义,例如\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 :(得分: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。