我有兩個大數組的代碼行(所以不能把它寫入散列),我想用散列連接。如何在Perl中將兩個數組分配給哈希?
例如,$array1[0]
成爲關鍵字,$array2[0]
成爲$array1[150]
,$array2[150]
的值等。
任何想法如何做到這一點?
我有兩個大數組的代碼行(所以不能把它寫入散列),我想用散列連接。如何在Perl中將兩個數組分配給哈希?
例如,$array1[0]
成爲關鍵字,$array2[0]
成爲$array1[150]
,$array2[150]
的值等。
任何想法如何做到這一點?
你可以做一個單一的任務:
my %hash;
@hash{@array1} = @array2;
這是一個常見的成語。從perldoc perldata on slices:
如果你搞不清楚爲什麼您使用 一個「@」有一個散列切片的「%」而不是 ,想起來這個樣子。 括號(正方形或捲曲)的類型 管轄它是否是一個數組或正在查看的 散列。在其他 指針上,數組或哈希上的前導符號('$'或'@') 指示您是否獲取單數值 (標量)或複數(列表)。
當我看到這些我看到了拉鍊的精神形象一個...
馬丁克萊頓有best answer for your general question,放也有在Perl 5.12一個有趣的新功能。您可以使用each on an array,以便您可以輕鬆地遍歷並行數組。
while(my($index, $value) = each @array1) {
...; # maybe do something to $value
$hash{ $value } = $array2[$index];
}
http://news.perlfoundation.org/2010/09/perl-5122-released.html – 2010-09-15 18:27:54
(我試過張貼這是布萊恩的回答評論,但無法得到的格式右)
你必須:當你想使用它們之前操作的值是非常有用要小心避免嵌套使用each
。 each
適用於陣列上的「全局」迭代器。到達最後時,返回false,然後將位置重置爲開始位置。因此下面的代碼會導致無限循環。
感謝RJBS的talk at YAPC::NA,他指出了內置迭代器的全局性。
use strict;
use warnings;
my @array = 'A' .. 'J' ;
while (my ($index, $value) = each @array){
print "printing ($index, $value) from outer loop\n";
while (my ($index_in, $value_in) = each @array){
print "printing ($index_in, $value_in) from inner loop\n";
}
}
那麼,你必須避免各種各樣的事情,可以搞砸你的程序。這全部記錄在每個perlfunc條目中。 – 2010-09-15 15:34:24
@brian。我沒有抱怨你的答案,只是想幫助防止難以解釋的錯誤。 ;)現在回想起來,我可能給出了太多的信息給出了這個問題。 – 2010-09-15 17:03:33
use List::MoreUtils qw(zip);
my @a = 'A' .. 'E';
my @b = 1 .. 5;
my %hash = zip @a, @b;
花絮:你不是唯一的一個。在python中,有一個內置函數用於將兩個並行數組轉換爲一個由兩個元素組成的單個數組,並且它被稱爲... zip()! http://docs.python.org/library/functions.html#zip :) – 2010-09-15 08:57:09
Perl在[List :: MoreUtils](http://search.cpan.org/dist/List-MoreUtils)中有一個「zip」 。還有[在Perl中是否有優雅的zip交錯兩個列表](http://stackoverflow.com/q/38345/8817)。 – 2010-09-15 11:11:10