如何将两个数组分配给 Perl 中的哈希?
Posted
技术标签:
【中文标题】如何将两个数组分配给 Perl 中的哈希?【英文标题】:How can I assign two arrays to a hash in Perl? 【发布时间】:2011-04-12 13:43:09 【问题描述】:我有两个大数组的代码行(所以不能只将其写入哈希),我想用哈希连接它们。
例如,$array1[0]
成为键,$array2[0]
成为值,依此类推,$array1[150]
,$array2[150]
。
任何想法我如何做到这一点?
【问题讨论】:
【参考方案1】:您可以在一个作业中完成:
my %hash;
@hash@array1 = @array2;
这是一个常见的成语。来自perldoc perldata on slices:
如果您对使用的原因感到困惑 一个'@'在一个散列片上而不是 '%',这样想。这 括号类型(方括号或花括号) 控制它是数组还是 哈希正在查看。在另一 手,前导符号('$' 或 '@') 对数组或散列表示是否 你得到一个奇异值 (标量)或复数(列表)。
当我看到其中一个时,我会在脑海中看到拉链的形象......
【讨论】:
琐事:你不是唯一一个。在 python 中,有一个内置函数可以将两个并行数组转换为一个由两个元素元组组成的数组,它被称为... zip()! docs.python.org/library/functions.html#zip :) Perl 在List::MoreUtils 中有一个zip
。还有 [Perl 中是否有一个优雅的 zip 可以将两个列表交错](***.com/q/38345/8817)。【参考方案2】:
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];
【讨论】:
【参考方案3】:(我尝试将此作为对布赖恩答案的评论发布,但格式不正确。)
您必须小心避免嵌套使用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 条目中。 @brian。我并没有抱怨您的回答,只是想帮助防止难以解释的错误。 ;) 回想起来,考虑到手头的问题,我可能提供了太多信息。【参考方案4】:use List::MoreUtils qw( zip );
my @a = 'A' .. 'E';
my @b = 1 .. 5;
my %hash = zip @a, @b;
【讨论】:
以上是关于如何将两个数组分配给 Perl 中的哈希?的主要内容,如果未能解决你的问题,请参考以下文章