gpt4 book ai didi

perl - 为什么打印时哈希键的顺序不同?

转载 作者:行者123 更新时间:2023-12-03 18:19:30 24 4
gpt4 key购买 nike

我想使用相同的键构建多个散列,并且在打印它们时键具有相同的顺序。因此,在下面的示例中,$hash1 的键和 $hash2应该始终具有相同的顺序,但在创建哈希时不需要保持该顺序。

use Data::Dumper;

my $hash1 = {
keyc => 2,
key1 => 1,
keya => 3,
keyb => 4,
};

my $hash2 = {
keyc => 2,
key1 => 1,
keya => 3,
keyb => 4,
};

print Dumper $hash1, $hash2;

但输出如下:
$VAR1 = {
'key1' => 1,
'keyc' => 2,
'keyb' => 4,
'keya' => 3
};
$VAR2 = {
'keyb' => 4,
'keya' => 3,
'keyc' => 2,
'key1' => 1
};

即哈希具有不同且意外的顺序。我的perl怎么了?

我的 perl 版本是:
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

注意:我知道 perl 哈希的键是未排序的。我希望它们具有相同的顺序,但不需要排序顺序。如果我再次运行代码,我希望我能得到相同的打印输出。

根据答案的建议,我设置了两个环境变量:
PERL_HASH_SEED=0x00 PERL_PERTURB_KEYS=0
然后,当我重复运行代码时,我可以获得相同的输出。

最佳答案

打印哈希时,有几个不同的相关顺序概念:“插入顺序”、“排序顺序”和“随机”。见ENVIRONMENT section of the perlrun 用于讨论控制此行为的方法以及默认使用哈希随机化的原因的文档。

至少十年来,perl 中的散列不能保证键顺序。最近,哈希随机化已成为一般安全“强化”工作的一部分。将哈希随机化是有充分理由的。更多详情请参阅 perlsec discussion of algorithmic complexity attacks .您将在 Perl 安全文档中注意到 perl-5.18 中添加了进一步的增强功能。 - 如果您看到与以前版本相比不同的行为,则可能是由于这些最近的更改。

除了明确 sorting your hash keys以一种确定的方式,您可以采用其他方法来对哈希进行排序: Hash::Ordered 是一个例子。 Hash::Ordered文档对许多其他模块的优缺点进行了很好的讨论。

哈希是按键值对排列的标量的“无序篮子”;数组是标量的“有序序列”[ 1 ]。 “slice”是“同时访问列表、数组或散列的多个元素”的方式。切片使用 @ sigil,因为该操作返回多个值的列表 - 并且带有 @我们得到“有序序列”。结果是在哈希上施加一种“顺序”的一种方法是使用切片来访问它:

# We want alphabetical disorder ...
my %hashed = ( 1 => "z", 2 => "x", 3 => "y" );
for my $key ( keys %hashed ) { print $hashed{$key} } ;
__END__
zyx

我们想要“ zxy”而不是“ zyx”。为了将我们的任意版本的顺序强加在这个哈希上,我们首先需要认识到这里的罪魁祸首是 keys %hashed。它以随机顺序返回键。解决方法是 sort ccurse 的键,在这个人为的例子中,我们将它们存储在 @sort_order并用它从哈希中“切出”我们想要的东西,就像我们想要的那样:
my @sort_order = sort keys %hashed ;
print @hashed{@sort_order} ;
__END__
zxy

多田!!当您希望将键和值存储在散列中但以有序的方式访问该数据时,切片可能很有用。当你想要对哈希进行切片时,请记住“ @”;作为 perldata 把它说:“你使用 '@' ...在一个散列片上...... [因为]你正在返回......一个列表”。并且列表是有序的。

[ 1 ] 将哈希定义为“无序篮子”和将数组定义为“有序序列”来自 Mike Friedman (FRIEDO) 在 Arrays vs. Lists in Perl 上的优秀文章.

更多引用资料
  • 参看。 perlfaq -q How can I always keep my hash sorted?
  • 除了创建许多真正有用的 CPAN 模块之外,GARU (Breno de Oliveira) 还发布了 an excellent article on hash ordering彻底涵盖了最近的 Perl 开发和散列随机化问题。
  • 有关可以使用哈希切片执行的更高级示例,请参阅 Vince Veselosky 的文章 Hash slices can replace loops .
  • 关于perl - 为什么打印时哈希键的顺序不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30340027/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com