为什么我使用perl 5.12.4和5.20.2获得包装(' H *',...)的意外结果?

时间:2015-05-13 16:19:05

标签: perl pack

我在XORing,($a ^= $b),字符串,并且必须将它们表示为十六进制数字。我可以使用sprintf执行此操作,但如果可能,我更喜欢使用pack('H*', ...)。我已打包测试代码,用于表达嵌入式注释的问题。谁能解释为什么pack('H*', ...)语句失败了?谢谢和问候。

use strict;

my @a = qw(a b c d e f g h);
print "@a\n";
my @b = map ord, @a;
foreach (@b) { print "$_\n" };
print scalar(@b), "\n";
my $pad = pack('H*', @b);   # why doesn't this work????
print "\$pad after pack('H*', \@b) = $pad \t\t # garbage :-(\n";
print length($pad), "\n";
$pad = pack('C*', @b);
print "\$pad after pack('C*', \@b) = $pad \t # correct\n";

$pad =~ s/(.)/sprintf("%x",ord($1))/eg;
print "\$pad after sprintf() = $pad\t # correct :-)\n";

exit(0);

再次感谢。

1 个答案:

答案 0 :(得分:3)

您真正想要的结果是什么?

H的{​​{1}}模板需要十六进制字符串,并返回由这些十六进制代码点处的字符组成的字符串。因此pack将为您提供pack 'H*', '414243'

猜测你想要反过来,所以像这样使用ABC

unpack

<强>输出

my @a = qw(a b c d e f g h);
say unpack 'H*', join '', @a;