【问题标题】:Test, if a hash key exists and print values of Hash in perl测试是否存在哈希键并在 perl 中打印哈希值
【发布时间】:2012-08-10 06:04:30
【问题描述】:

如果数组中存在键,我想从哈希中打印该键及其值。这是我写的代码。

for($i=0;$i<@array.length;$i++)
{
    if (exists $hash{$array[$i]})
    {
        print OUTPUT $array[$i],"\n";
    }
}

通过上面的代码,我可以打印密钥。但我不确定如何打印该键的值。

有人可以帮我吗?

谢谢

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    @array.length 在语法上是合法的,但绝对不是你想要的。

    @array,在标量上下文中,为您提供数组中元素的数量。

    length 函数不带参数,为您提供$_ 的长度。

    . 运算符执行字符串连接。

    所以@array.length@array 中的元素个数和$_ 中包含的字符串的长度,将它们视为字符串,并将它们连接在一起。 $i &lt; ... 强加了一个数字上下文,所以它很可能被视为一个数字——但肯定不是你想要的。 (如果@array有15个元素,而$_恰好是7个字符,那么这个数字应该是157,一个没有意义的值。)

    计算@array 中元素数量的正确方法是在标量上下文中使用@array——或者,更明确地说,scalar @array

    回答你的问题,如果$array[$i]是一个key,那么对应的value就是$hash{$array[$i]}

    但 C 风格的 for 循环并不是遍历数组的最简洁方式,尤其是在每次迭代只需要值而不是索引的情况下。

    foreach my $elem (@array) {
        if (exists $hash{$elem}) {
            print OUTPUT "$elem\n";
        }
    }
    

    【讨论】:

    • use Array::Utils qw(:all); for(intersect(@array,keys %hash)){print;}
    【解决方案2】:

    使用哈希切片的一些替代方法:

    foreach (@hash{@array}) { print OUTPUT "$_\n" if defined };
    
    print OUTPUT join("\n",grep {defined} @hash{@array});
    

    (对于喜欢打高尔夫球的人)。

    【讨论】:

      猜你喜欢
      • 2011-10-27
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2016-12-18
      • 2013-06-24
      相关资源
      最近更新 更多