4

如何按照添加到散列的顺序打印散列的键/值对。

例如:

%hash = ("a", "1", "b", "2", "c", "3");
while (($key, $value) = each %hash) {
   print "$key", "$value\n";
}

上述结果如下:

c3
a1
b2

我正在寻找一种打印以下内容的方法:

a1
b2
c3

提前致谢!

4

5 回答 5

8

如何按照它们在散列中出现的顺序打印散列的键/值对。

您使用的代码正是这样做的。c3, a1, b2 是元素当时在哈希中出现的顺序。

您实际上想要按照插入的顺序打印它们。为此,您需要跟踪插入元素的顺序,或者您必须使用哈希以外的其他内容,例如前面提到的Tie::IxHashTie::Hash::Indexed

于 2013-10-25T12:09:24.843 回答
5

哈希没有排序。您需要选择另一种数据结构。

于 2013-10-25T11:57:07.703 回答
5

您需要Tie::IxHash用于有序哈希的模块,

use Tie::IxHash;

tie(my %hash, 'Tie::IxHash');
%hash = ("a", "1", "b", "2", "c", "3");

while (my ($key, $value) = each %hash) {
  print "$key", "$value\n";
}
于 2013-10-25T12:01:34.150 回答
5

散列通常是无序的。您可以改为使用有序哈希。从 CPAN尝试Tie::Hash::Indexed 。

从文档中:

  use Tie::Hash::Indexed;

  tie my %hash, 'Tie::Hash::Indexed';

  %hash = ( I => 1, n => 2, d => 3, e => 4 );
  $hash{x} = 5;

  print keys %hash, "\n";    # prints 'Index'
  print values %hash, "\n";  # prints '12345'
于 2013-10-25T12:02:50.700 回答
4

由于您不想使用任何提到的模块(Tie::IxHash 和 Tie::Hash::Indexed),并且由于哈希是无序集合(如前所述),因此您必须在插入值时存储此信息:

#!/usr/bin/perl
use warnings;
use strict;

my %hash;
my %index; #keep track of the insertion order
my $i=0;
for (["a","1"], ["b","2"], ["c","3"]) { #caveat: you can't insert values in your hash as you did before in one line
    $index{$_->[0]}=$i++;
    $hash{$_->[0]}=$_->[1];
}

for (sort {$index{$a}<=>$index{$b}} keys %hash) {  #caveat: you can't use while anymore since you need to sort
   print "$_$hash{$_}\n";
}

这将打印:

a1
b2
c3
于 2013-10-25T12:30:21.893 回答