我是perl编程的新手,并且很难适应从C到perl。非常感谢你的帮助。
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
my %tgs;
$tgs{"0"}{"1"} = 01;
$tgs{"0"}{"2"} = 02;
$tgs{"0"}{"3"} = 03;
$tgs{"1"}{"1"} = 11;
$tgs{"1"}{"2"} = 12;
$tgs{"1"}{"3"} = 13;
$tgs{"2"}{"1"} = 21;
$tgs{"2"}{"2"} = 22;
$tgs{"2"}{"3"} = 23;
print Dumper(\%tgs);
exit(0);
o / p是
$VAR1 = {
'1' => {
'1' => 11,
'3' => 13,
'2' => 12
},
'0' => {
'1' => 1,
'3' => 3,
'2' => 2
},
'2' => {
'1' => 21,
'3' => 23,
'2' => 22
}
};
我已按1,2,3的顺序输入哈希值。但是当我打印订单时,先是1然后是0然后是2.为什么会这样呢?有什么方法可以控制这个吗?我需要控制它,因为我将在foreach
循环中读取此数据,假设它的顺序为0 1 2 3 ...
答案 0 :(得分:6)
Perl不保证散列中键的顺序。如果必须按特定顺序循环遍历元素,则可以执行以下操作:
for (sort keys %myhash) {
print Dumper($tgs{$_});
}
或者如果键不容易排序,您可能需要使用带有映射的数组:
my %tgs;
$tgs{"0"}{"1"} = 01;
$tgs{"0"}{"2"} = 02;
$tgs{"0"}{"3"} = 03;
$tgs{"1"}{"1"} = 11;
$tgs{"1"}{"2"} = 12;
$tgs{"1"}{"3"} = 13;
$tgs{"2"}{"1"} = 21;
$tgs{"2"}{"2"} = 22;
$tgs{"2"}{"3"} = 23;
my @tag_keys = qw(1 2 3);
然后使用:
foreach (@tag_keys) {
print Dumper($tgs{$_});
}
答案 1 :(得分:2)
正如您所发现的,哈希是无序的。如果您熟悉C中的“哈希表”,它基本上是相同的 - 键通过哈希函数传递,哈希键最终由生成的哈希值排序。如果散列函数是好的(它是),那么该顺序实际上是随机的。此外,最新版本的Perl实现了随机化功能,这将导致每次程序运行时哈希键的顺序不同。所以你真的,真的不能指望具有任何特定顺序的哈希键。
或者至少你不能......默认情况下。
长期以来一直希望哈希记住键被插入的顺序,所以有人发明了Tie::IxHash,它的行为就像一个常规哈希,除了它还附加一些元数据到每个键以表明它们顺序。