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

为什么我在使用perl 5.12.4和5.20.2的pack(';H*';,…)时会得到意想不到的结果?,perl,pack,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 sc

我是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);

再次感谢。

你到底想要什么结果

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

大概你想要的是相反的,所以像这样使用
unpack

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

6162636465666768

你到底想要什么结果

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

大概你想要的是相反的,所以像这样使用
unpack

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

6162636465666768

你到底想要什么结果

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

大概你想要的是相反的,所以像这样使用
unpack

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

6162636465666768

你到底想要什么结果

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

大概你想要的是相反的,所以像这样使用
unpack

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

6162636465666768

谢谢你,博罗丁。我犯了飞行员错误。我假设pack根据模板转换了它的LIST参数。现在我可以做我真正想做的事情,这相当于$pad='abcdefgh'$pad=拆包“H*”,$pad;并避免使用低效的s//表达式。@perlboy:每个模板通常会使用列表中的一项,因此
pack'(H*)*','414243','444546'
给您
ABCDEF
pack'(H2)*','414243','444546'
给您
AD
是的,我现在明白了,谢谢。其中$pad是ASCII字符串,我可以做$pad=unpack'H*,$pad$msg^=$pad$msg=包装“H*”,$msg;获取可读的ASCII。非常好,比正则表达式快。谢谢你。我犯了飞行员错误。我假设pack根据模板转换了它的LIST参数。现在我可以做我真正想做的事情,这相当于$pad='abcdefgh'$pad=拆包“H*”,$pad;并避免使用低效的s//表达式。@perlboy:每个模板通常会使用列表中的一项,因此
pack'(H*)*','414243','444546'
给您
ABCDEF
pack'(H2)*','414243','444546'
给您
AD
是的,我现在明白了,谢谢。其中$pad是ASCII字符串,我可以做$pad=unpack'H*,$pad$msg^=$pad$msg=包装“H*”,$msg;获取可读的ASCII。非常好,比正则表达式快。谢谢你。我犯了飞行员错误。我假设pack根据模板转换了它的LIST参数。现在我可以做我真正想做的事情,这相当于$pad='abcdefgh'$pad=拆包“H*”,$pad;并避免使用低效的s//表达式。@perlboy:每个模板通常会使用列表中的一项,因此
pack'(H*)*','414243','444546'
给您
ABCDEF
pack'(H2)*','414243','444546'
给您
AD
是的,我现在明白了,谢谢。其中$pad是ASCII字符串,我可以做$pad=unpack'H*,$pad$msg^=$pad$msg=包装“H*”,$msg;获取可读的ASCII。非常好,比正则表达式快。谢谢你。我犯了飞行员错误。我假设pack根据模板转换了它的LIST参数。现在我可以做我真正想做的事情,这相当于$pad='abcdefgh'$pad=拆包“H*”,$pad;并避免使用低效的s//表达式。@perlboy:每个模板通常会使用列表中的一项,因此
pack'(H*)*','414243','444546'
给您
ABCDEF
pack'(H2)*','414243','444546'
给您
AD
是的,我现在明白了,谢谢。其中$pad是ASCII字符串,我可以做$pad=unpack'H*,$pad$msg^=$pad$msg=包装“H*”,$msg;获取可读的ASCII。工作非常好,比正则表达式快。注意:
foreach(@b){print“$\n”}
,code>最好写成
print“$\n”。注意:
foreach(@b){print“$\n}
,code>最好写成
print“$\n”。注意:
foreach(@b){print“$\n}
,code>最好写成
print“$\n”。注意:
foreach(@b){print“$\n}
,code>最好写成
打印“$\un”。