如何在Perl中为哈希分配两个数组?

时间:2010-09-15 08:37:45

标签: perl hash

我的代码行有两个大型数组(所以不能把它写成哈希)我想用哈希连接。

例如,$array1[0]成为关键,$array2[0]成为值,依此类推$array1[150]$array2[150]

我是怎么做到的?

4 个答案:

答案 0 :(得分:65)

您可以在一个作业中执行此操作:

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

这是一个常见的习语。来自perldoc perldata on slices

  

如果您对使用原因感到困惑   而是在哈希切片上的'@'   一个'%',想起来就像这样。该   支架类型(方形或卷曲)   管理它是一个数组还是一个   看着哈希。在另一   手,领先符号('$'或'@')   在数组或哈希表示是否   你得到了一个奇异的价值   (标量)或复数(列表)。

当我看到其中一个时,我看到拉链的心理形象......

答案 1 :(得分:16)

martin clayton有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];
      }

答案 2 :(得分:4)

use List::MoreUtils qw( zip );

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

my @b = 1 .. 5;

my %hash = zip @a, @b;

答案 3 :(得分:3)

(我试着将此作为对brian答案的评论发布,但无法正确格式化。)

您必须小心避免使用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";
        }
}