2012-04-05 87 views
3

我想遍历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

鉴于问题中的关键,只需对排序比较器进行简单的更改即可获得所需的输出。

for my $gPort (sort keys %HASH) { 
    print "$gPort => $HASH{$gPort}\n"; 
} 

注:上面的代码假定在键的所有数字将发生在相同的位置,并且具有相同的长度。例如,一个rajesh:001775密钥将首先出现,而不是在1770和1780之间。

+0

它不是在案件档案内容的工作都具有这样的HASH 拉杰什:2130 拉杰什:1780 拉杰什:2060 拉杰什:1810 拉杰什:1700 预期结果是 拉杰什:1700 拉杰什:1780 拉杰什:1810 拉杰什:1810 拉杰什:2060 rajesh:2130 – 2012-04-05 12:49:00

+1

您不能在散列中重复键;散列的要点是查找唯一键并检索关联的值。如果您只想存储有序对,请使用数组。 – 2012-04-05 12:58:15

+0

是的,我们不能。我只给你了钥匙清单。我的意思是这是一个关键 - “rajesh:1700” – 2012-04-05 13:00:43

1

您可以排序并打印出一个散列,按VALUE(非键)排序。

for my $gPort (sort { $HASH{$a} <=> $HASH{$b} } keys %HASH) { 
    print "$gPort => $HASH{$gPort}\n"; 
} 
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"; 
} 
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