为什么我使用 perl 5.12.4 和 5.20.2 使用 pack('H*', ...) 会得到意想不到的结果?

Why am I getting unexpected results with pack('H*', ...) with perl 5.12.4 and 5.20.2?

我正在对 ($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())/eg;
print "$pad after sprintf() = $pad\t # correct :-)\n";

exit(0);

再次感谢。

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

packH 模板需要一个十六进制字符串,returns 一个由这些十六进制代码点处的字符组成的字符串。所以 pack 'H*', '414243' 会给你 ABC

我猜你想要相反的结果,所以像这样使用 unpack

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

输出

6162636465666768