E.g:
$myVar="this#@#!~`%^&*()[]}{;'".,<>?/\";
我无法导出此变量并将其用于我的程序中。
任何人都可以帮忙吗?
答案 0 :(得分:5)
如果我了解你的任务,这就是quotemeta的用途。来自链接的文档
返回EXPR的值,并将所有非“word”字符反斜杠。 (也就是说,所有不匹配
/[A-Za-z_0-9]/
的字符都将在返回的字符串中以反斜杠开头,而不管任何语言环境设置。)这是在双引号字符串中实现\Q
转义的内部函数。
它的使用非常简单
my $myVar = q(this#@#!~`%^&*()[]}{;'".,<>?/\\);
print "$myVar\n";
my $quoted_var = quotemeta $myVar;
print "$quoted_var\n";
请注意,我们必须手动转义最后一个反斜杠,以防止它转义结束分隔符。或者你可以在最后添加一个额外的空格,然后将其剥离(chop)。
my $myVar = q(this#@#!~`%^&*()[]}{;'".,<>?/\ );
chop $myVar;
现在使用$myVar
转换quotemeta
,如上所述。
我将外部"
对仅表示你在变量中的内容。但是如果它们实际上是在变量中,那么只需将它全部放在q()
中,从那以后最后一个字符是"
。唯一的问题是在结束分隔符之前的反斜杠。
如果您在正则表达式上下文中需要此功能,则可以使用\Q
启动并\E
结束转义。
答案 1 :(得分:4)
my $myVar=q("this#@#!~`%^&*()[]}{;'".,<>?/\");
$myVar = quotemeta($myVar);
print $myVar;
或者使用正则表达式替换来转义所有字符
my $myVar=q("this#@#!~`%^&*()[]}{;'".,<>?/\");
$myVar =~s/(\W)/\\$1/g;
print $myVar;
答案 2 :(得分:-1)
\ Q和\ E之间的内容被视为普通字符,而不是正则表达式字符。例如,
'.' =~ /./; # match
'a' =~ /./; # match
'.' =~ /\Q.\E/; # match
'a' =~ /\Q.\E/; # no match
它不会阻止变量被插值。
$search = '.';
'.' =~ /$search/; # match
'a' =~ /$search/; # match
'.' =~ /\Q$search\E/; # match
'a' =~ /\Q$search\E/; # no match