簡體   English   中英

如何在Perl中為哈希分配兩個數組?

[英]How can I assign two arrays to a hash in Perl?

我有兩行代碼和兩個大數組(所以不能把它寫成哈希),我想用哈希連接。

例如, $array1[0]成為鍵, $array2[0]成為值,依此類推到$array1[150]$array2[150]

我有什么想法嗎?

您可以在一個作業中完成:

my %hash;
@hash{@array1} = @array2;

這是一個常見的習語。 來自切片上的perldoc perldata

如果你對為什么在哈希切片而不是'%'上使用'@'感到困惑,那就這樣想吧。 括號的類型(方形或卷曲)決定它是一個數組還是正在查看的哈希。 另一方面,數組或散列上的前導符號('$'或'@')表示您是返回單數值(標量值)還是復數值(列表)。

當我看到其中一個時,我看到拉鏈的心理形象......

對於你的一般問題 ,馬丁克萊頓有最好的答案,在Perl 5.12中也有一個有趣的新功能。 您可以在陣列上使用每個,以便您可以輕松地遍歷並行數組。 在您使用它們之前想要操縱值時,它非常有用:

 while( my( $index, $value ) = each @array1 ) {
      ...; # maybe do something to $value
      $hash{ $value } = $array2[$index];
      }
use List::MoreUtils qw( zip );

my @a = 'A' .. 'E';

my @b = 1 .. 5;

my %hash = zip @a, @b;

(我試着將此作為對brian答案的評論發布,但無法正確格式化。)

您必須小心避免each嵌套使用。 each在數組上的“全局”迭代器上工作。 當它到達結尾時,它返回false,然后將位置重置為開頭。 因此,下面的代碼會導致無限循環。

感謝RJBS 在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";
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM