您遇到的数组和哈希之间存在关系:
my %hash = ( one => 1, two => 2, three => 3 );
这将创建一个三成员散列,其键one
为 、two
和 `three。这样做也是如此:
my %hash = ( "one", 1, "two", 2, "three", 3 );
事实上,这两行是完全一样的语句。这=>
是一种语法糖,用于突出一个值与另一个值之间的关系。这又是同一行。我只是在搞乱你的大脑,但它会产生与以前相同的哈希:
my %hash = ( "one", 1 => "two", 2 => "three", 3 );
这是分配相同哈希的另一种方法:
my @array = ( "one", 1, "two", 2, "three", 3 );
my %hash = @array;
这也是有效的:
my @array = %hash;
Perl 中的散列和数组之间有很强的关系。如果在散列上下文中获取一个数组,它就会变成一个散列。如果您在数组上下文中获取哈希值,它就会变成一个数组。例如:
mysub (%hash);
sub mysub {
my %subhash = @_;
...
}
这是将散列传递给子例程的有效(尽管不是推荐的方式)。散列被翻译成@_
数组,然后在子例程中被翻译回散列。
让我们看看你的循环:
for my $k1 (%read_data) {
这(...)
是一个列表/数组上下文,因此将获取您的%read_data
哈希,并将其呈现在列表上下文中,每个键后跟它的值。
有几种方法可以解决这个问题。一种是使用键提取散列中的所有键并返回键的数组。这通常与sort结合使用,以将键排序为某种顺序。
for my $k1 ( sort keys %read_data ) {
另一种是使用each返回一系列两个成员数组,其中一个键和一个值。