我想一个接一个地穿越HASH。不是以随机的方式。任何的想法。例如,我有像这样的哈希文件......
our %HASH = (
'rajesh:1700' => Bangalore,
'rajesh:1730' => Delhi,
'rajesh:1770' => Ranchi,
'rajesh:1780' => Mumbai,
'rajesh:1800' => MYCITY,
'rajesh:1810' => XCF,
);
它应该以相同的方式打印。我尝试了以下但失败了。有什么想法吗?
while ( my $gPort = each %HASH)
{
print "$gPort\n";
}
for my $gPort ( keys %HASH )
{
print "$gPort\n";
}
答案 0 :(得分:4)
考虑到问题中的关键点,对排序比较器的简单更改将提供您想要的输出。
for my $gPort (sort keys %HASH) {
print "$gPort => $HASH{$gPort}\n";
}
注意:上面的代码假设键中的所有数字都出现在同一位置且长度相同。例如,rajesh:001775
键将首先出现,而不是在1770和1780之间出现。
答案 1 :(得分:1)
你可以排序并打印出一个哈希,按VALUE(不是键)排序。
for my $gPort (sort { $HASH{$a} <=> $HASH{$b} } keys %HASH) {
print "$gPort => $HASH{$gPort}\n";
}
答案 2 :(得分:0)
看看Data::Dumper。特别是,如果设置$Data::Dumper::Sortkeys
,那么您将按排序顺序获取转储。
举个例子:
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
my %some_hash;
# code to populate hash
[ . . . ]
print Dumper(\%some_hash);
当然,只有当您想要明确地转储哈希时,这才有效。如果您希望以其他格式完成打印,您可能只想对键进行排序并打印,如
foreach my $key (sort keys %some_hash) {
print "[KEY]: $key; [VAL]: $some_hash{$key}\n";
}
答案 3 :(得分:0)
如果您希望在哈希中保留元素的插入顺序,那么Tie::IxHash可能是您的工具。它的用法非常简单:
显示简单示例:
use Tie::IxHash;
tie my %days_in => 'Tie::IxHash',
January => 31,
February => 28,
March => 31,
April => 30,
May => 31,
June => 30,
July => 31,
August => 31,
September => 30,
October => 31,
November => 30,
December => 31;
print join(" ", keys %days_in), "\n";
# prints: January February March April May June July August
# September October November December