2013-02-14 27 views
1

Tie :: IxHash會生成一個對象,該對象具有作爲數組和哈希的大部分行爲集。但我找不到相當於返回(鍵,值)對的each函數。Perl Tie :: IxHash - 是否有'each'方法?

我剛剛忽略了它嗎?

如果我要推出自己的,我還以爲像這樣的工作:

use Tie::IxHash; 
$t = Tie::IxHash->new(a,1,b,2,c,3); 
while (($x1, $x2) = map { $_ => $t->Values($_) } $t->Keys) { say "$x1 => $x2"; } 

但輸出是一個無窮級數的

a => 1 

...原因這對我來說還不清楚。

任何人都可以建議如何實現each並列散列?

+1

回覆:「但輸出是一個無限系列'a => 1'」:這是因爲'map {$ _ => $ t-> Values($ _)} $ t-> Keys'總是評估列表'(a,1,b,2,c,3)'。您的任務將'$ x1'和'$ x2'設置爲該列表的前兩個元素,並放棄其餘部分。 ('each'「記得」你在哪裏散列,但你的'while''循環沒有這樣的東西,每次迭代都會檢索整個列表並丟棄除開頭之外的所有列表。) – ruakh 2013-02-15 00:11:59

+0

是的,我現在看到,有仔細閱讀'each' doc。它看起來像我可以擊敗我的頭來試圖編寫一個維持一個持久化迭代器的函數,或者直接在'$ t-> Keys'上編寫一個'foreach'循環並檢索'$ t-> Values($鍵)'。 – Chap 2013-02-15 00:25:20

回答

6

Tie::IxHash不具有Each方法,但你可以使用Perl的each功能上綁哈希:

use Tie::IxHash; 
my $t = tie my %hash, 'Tie::IxHash'; 
@hash{qw/a b c d e/} = (1, 2, 3, 4, 5); 

# using the tied hash 
while (my ($key, $val) = each %hash) { 
    print "$key => $val\n"; 
} 

# using the OO interface (interchangeably) 
foreach my $key ($t->Keys) { 
    my $val = $t->FETCH($key); 
    print "$key => $val\n"; 
} 

注意$t->Values($key)將無法​​正常工作。這種方法期望索引不是關鍵。這將工作:

foreach (0 .. $t->Length - 1) { 
    my ($key, $val) = ($t->Keys($_), $t->Values($_)); 
    ... 
} 
+0

什麼是FETCH?我沒有看到記錄。 – Chap 2013-02-15 04:33:35

+4

FETCH在文檔中被提及爲對象接口部分中的第一項。它是使其能夠用作連接散列以及存儲,刪除,存在等等所需的方法之一。 (請參閱http://perldoc.perl.org/perltie.html#Tying-哈希和http://perldoc.perl.org/Tie/Hash.html) – stevenl 2013-02-15 05:07:19