在Perl中,为什么变量插值对于十六进制转义序列失败?

时间:2013-08-02 05:54:22

标签: perl escaping character sequence interpolation

在Perl中,如果我运行代码:

print "Literal Hex: \x{50} \n";

我明白了:“Literal Hex: P

但是,如果我运行代码:

my $hex_num = 50; 
print "Interpolated Hex: \x{$hex_num}";

变量没有正确插值,我得到了这个:“Interpolated Hex:

当我尝试在unicode和八进制转义序列中使用变量插值时,会产生类似的失败。

是否可以将转义序列(例如\ x,\ N)与插值字符串变量一起使用?我的印象是双引号中包含的$变量总是被插值,但这是例外吗?

注意:感谢this question,我知道解决方法:chr(hex($hex_num)),但我上面关于转义序列的变量插值的问题仍然存在。

3 个答案:

答案 0 :(得分:7)

插值不是递归的,所有内容都是从左到右插入一次。因此,在处理\x{$hex}时,以下情况适用(引自perlop):

  

如果大括号之间没有有效数字,则生成的字符为NULL              字符(“\ x {00}”)。

零真的存在:

perl -MO=Deparse -e '$h=50;print "<\x{$h}>"'
$h = 50;
print "<\000>";
-e syntax OK

答案 1 :(得分:1)

您应该在变量中输入完整的转义序列:

my $hex_num = "\x50"; 
print "Interpolated Hex: $hex_num", "\n";

答案 2 :(得分:1)

我遇到的问题是将转义的var添加到另一个变量中,例如:

$MYVAR = "20";
$myQuery = "\x02\x12\x10\x$MYVAR\x10";

尝试了一些\\ x,\ Q \ x和其他各种转义序列无济于事!!!

我的解决方法不是直接转义,而是在添加到字符串之前转换var。

$MYVAR = chr(hex(20));

有相当多的搜索直接正则表达式解决方案,但最终必须运行。