在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))
,但我上面关于转义序列的变量插值的问题仍然存在。
答案 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));
有相当多的搜索直接正则表达式解决方案,但最终必须运行。