2012-04-05 146 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