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

34

我有两个大数组的代码行(所以不能直接写入哈希表),我想将它们与哈希表连接。

例如,$array1 [0] 变为键,$array2 [0] 变为值,一直到 $array1 [150]$array2 [150]

有什么想法可以实现这个?

4个回答

70
你可以通过一次赋值完成它:
my %hash;
@hash{@array1} = @array2;

这是一个常见的习语。从perldoc perldata on slices中可知:

如果你对为什么在哈希切片上使用 '@' 而不是 '%' 感到困惑,可以这样想。方括号(方形或花括号)的类型决定了查看的是数组还是哈希。另一方面,数组或哈希前导符号('$' 或 '@')指示你获取的是单个值(标量)还是多个值(列表)。

当我看到其中之一时,我就会想象一个拉链的图像...


1
趣闻:你并不是唯一的一个。在Python中,有一个内置函数可以将两个平行数组转换成一个由两个元素组成的元组数组,它被称为…zip()!http://docs.python.org/library/functions.html#zip :) - Simon Whitaker
8
Perl中的zip函数可以在List::MoreUtils模块中找到。此外,还有一个问题:是否有一种优雅的方法来交错两个列表? - brian d foy

17

martin clayton在此问题的最佳答案中对你的一般问题进行了解答,但在Perl 5.12中也有一个有趣的新功能。你可以在数组上使用each函数,以轻松遍历并行数组。当你想在使用值之前操作这些值时,它非常有用:

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

4

我试着在brian的答案下留言,但是无法正确排版。

你必须小心避免嵌套使用eacheach在数组上工作时会有一个“全局”迭代器。当它到达末尾时,它会返回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";
        }
}

1
好的,您必须避免所有可能破坏您程序的事情。这些内容都在每个perlfunc条目中有记录。 - brian d foy
@brian。我并不是在抱怨你的回答,只是想帮助防止难以解释的错误。 ;) 回想起来,考虑到手头的问题,我可能提供了太多的信息。 - Christopher Bottoms

4
use List::MoreUtils qw( zip );

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

my @b = 1 .. 5;

my %hash = zip @a, @b;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接