如何按照添加到哈希的顺序打印哈希的键/值对。
例如:
%hash = ("a", "1", "b", "2", "c", "3");
while (($key, $value) = each %hash) {
print "$key", "$value\n";
}
以上结果如下:
c3
a1
b2
我正在寻找打印以下内容的方法:
a1
b2
c3
提前致谢!
答案 0 :(得分:8)
如何按哈希中出现的顺序打印哈希的键/值对。
您使用的代码正是如此。 c3,a1,b2是元素当时在hash中出现的顺序。
按照插入顺序打印它们实际上要做什么。为此,您需要跟踪插入元素的顺序,或者您必须使用散列之外的其他内容,例如前面提到的Tie::IxHash和Tie::Hash::Indexed。
答案 1 :(得分:5)
未订购哈希。您需要选择其他数据结构。
答案 2 :(得分: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";
}
答案 3 :(得分: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'
答案 4 :(得分:4)
因为您不想使用任何提到的模块(Tie :: IxHash和Tie :: Hash :: Indexed),并且因为哈希是 unordered collections (如上所述)之前),您必须在插入值时存储此信息:
#!/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