Perl:替换文字表达式和文字变量名

ruyhziif  于 2023-06-23  发布在  Perl
关注(0)|答案(3)|浏览(152)

当我使用这个表达式时:

echo '...${var}#other.([]);,=${var}#other${var}...' |
   perl -pe 's/\Q.([]);,=${var}\E/.([]);,=ok/'

正如预期的那样,变量${var}被扩展为“”(空值),并获得输出:

...${var}#other.([]);,=ok${var}#other${var}...

但我想

...${var}#other.([]);,=ok#other${var}...

所以我想转义这个变量:

echo '...${var}#other.([]);,=${var}#other${var}...' |
   perl -pe 's/\Q.([]);,=\${var}\E/.([]);,=ok/'

由于某种我不知道的原因,提供的字符串与输入字符串的一部分不匹配,并且它不会被替换:

...${var}#other.([]);,=${var}#other${var}...

\\$和三\\\$反斜杠也不匹配。
我哪里做错了?

nnvyjq4y

nnvyjq4y1#

根据perlop手册页(https://perldoc.perl.org/perlop):
对于正则表达式运算符(qr//m//s///)的模式,\Q的引用是在处理插值之后、转义之前应用的。这允许模式按字面意思匹配($@除外)。例如,以下匹配:

'\s\t' =~ /\Q\s\t/

因为$@触发插值,所以需要使用类似/\Quser\E\@\Qhost/的东西来匹配它们。
所以,在你的情况下,你可以写:

s/\Q.([])\E;,=\$\{var}/.([]);,=ok/
wixjitnu

wixjitnu2#

可以将阵列定义为:

echo '...${var}#other.([]);,=${var}#other${var}...' |
   perl -pe '$pattern=q|.([]);,=${var}|; s/\Q$pattern\E/.([]);,=ok/'
# output : ...${var}#other.([]);,=ok#other${var}...
pjngdqdw

pjngdqdw3#

\Q不会阻止插值。[1]
事实上,\Q通常被用作...\Q$var\E...,以匹配$var的字面值,我发现其他用法对阅读来说很费力。
为了便于阅读,在这种情况下,我会尝试使用以下代码:

perl -pe'my $text = q{.([]);,=${var}}; s/\Q$text/.([]);,=ok/'

1.它也没有引用分隔符(这就是为什么\E是可选的)。以及\L\Q之后的类似工作。

相关问题