字符串表示形式与perl中的值之间的差异

问题描述

| 我对以下区别感到困惑。
$str=\"\\xd6\\xd0\";
decode(\"GBK\",$str);
$str=\"d6d0\";
@list=map \"\\\\x\".$_,unpack(\"(a2)*\",$str);
$str=join \"\",@list;
decode(\"GBK\",$str);
为什么在第一种情况下,它可以打印出字符,而在第二种情况下,它不起作用?在后一种情况下如何使它工作? 非常感谢。     

解决方法

如果您要将
\"d6d0\"
变成
\"\\xd6\\xd0\"
,则需要
pack \'H*\'
my $str = \"d6d0\";
$str = pack(\'H*\',$str);
decode(\"GBK\",$str);
join
不解释转义序列,它仅连接字符串。     ,在第一种情况下,解析器解释转义序列并构建一个两个字节长的字符串。在第二种情况下,您将创建一个八个字符的字符串:
\\xd6\\xd0
。您可能想像打开包装一样打开包装,但不要在前面加上
\\x
,然后再将
pack
与模板
(H2)*
一起使用,而不是将它们组合在一起。