3

在 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)与插值字符串变量一起使用?我的印象是双引号中包含的 $variable 总是被插值,但这是例外吗?

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

4

3 回答 3

7

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

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

零真的存在:

perl -MO=Deparse -e '$h=50;print "<\x{$h}>"'
$h = 50;
print "<\000>";
-e syntax OK
于 2013-08-02T06:40:02.407 回答
1

您应该将完整的 scape 序列放入变量中:

my $hex_num = "\x50"; 
print "Interpolated Hex: $hex_num", "\n";
于 2013-08-02T06:19:21.160 回答
1

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

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

尝试了许多 \\x、\Q\x 和其他各种转义序列都无济于事!!!

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

$MYVAR = chr(hex(20));

做了相当多的搜索直接正则表达式解决方案,但最终不得不使用它。

于 2014-03-27T19:31:09.003 回答