【问题标题】:In Perl, how can I create a hash table from two equal length arrays?在 Perl 中,如何从两个相等长度的数组创建哈希表?
【发布时间】:2011-10-11 19:03:47
【问题描述】:

我正在尝试从 2 个相同长度的不同数组创建一个哈希。第一个数组的元素是“键”,第二个数组的元素是值。

我尝试了以下代码:仅供参考:数组“vss”指的是虚拟服务器名称,“vsports”指的是 tcp 端口。

my %vsnhash;
@vsnhash {@vss} = @vsports;
print Dumper(\%vsnhash); 

只要第一个数组中的所有元素(名称)都是唯一的,这对我有用。如果不是,我无法访问哈希中的所有键=>值,因为键重复。

如何为哈希创建一个额外的唯一“级别”或“键”,我可以使用它来引用具有重复名称(或“键”)的数据?

任何建议或替代解决方案都会非常有帮助。 谢谢

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:
    for (my $i = 0; $i < @vss; $i++) {
        push (@{$vsnhash->{$vss[$i]}}, $vsports[$i]);
    }
    

    然后将每个哈希键作为数组访问。该数组的大小将是键引用的数量。这里有一些例子:Perl data structure traversal -- reference followed key

    【讨论】:

    • 就风格而言,我会写$i &lt;= $#vss 而不是$i &lt; @vss。你拥有它的方式没有任何问题,但我发现我对@array 在标量上下文中评估数组大小的方式有点不舒服。 $#vss 更明确。 (在对$[ 进行更改的情况下,它也很强大,但没有人理智地更改$[。)或者我可能已经写了$i &lt; scalar @vss,我相信有些人会觉得过于冗长。
    • 我会写它for my $idx ( 0 .. $#vss ) { 它更明确地表达了我想循环索引从 0 到 @vss 的最后一个索引的想法。这个习惯用法很常见,perl 将在此上下文中优化范围运算符,使其不构建值列表,而是一次迭代一个值,从而节省内存。
    【解决方案2】:

    你也可以使用each_array from List::MoreUtils:

    #!/usr/bin/env perl
    
    use strict; use warnings;
    
    use List::MoreUtils qw( each_array );
    
    my @k = qw(a a b c d d e e f);
    my @v = qw(1 2 3 4 5 6 7 8 9);
    
    my %h;
    my $it = each_array(@k, @v);
    
    while (my ($k, $v) = $it->()) {
        push @{ $h{ $k } }, $v;
    }
    
    use YAML;
    print Dump \%h;
    

    输出:

    --- A: - 1 - 2 乙: - 3 C: - 4 d: - 5 - 6 e: - 7 - 8 F: - 9

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 2018-04-11
      • 2011-05-08
      • 2016-02-27
      • 2013-04-04
      • 2011-03-22
      • 2014-04-13
      • 2013-04-18
      • 2011-04-21
      相关资源
      最近更新 更多