按顺序遍历哈希

时间:2012-04-05 12:21:48

标签: perl hash

我想一个接一个地穿越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";
}

4 个答案:

答案 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
相关问题