迭代perl中的哈希值

时间:2010-11-10 14:43:22

标签: perl hash

我有一个哈希,让我们说20个值。

它以这种方式初始化:

my $line = $_[0]->[0];

    foreach my $value ($line) {
        print $value;
    }

现在,当我尝试获取$ line中每个哈希的值时,它说: 在file.pl第89行打印时使用未初始化的值

有没有办法迭代哈希的每个值?

我也尝试过:

my %line = $_[0]->[0];

    foreach my $key (keys %line) {
        print %line->{$key};
    }

但这也行不通: 参考文献在第89行的file.pl中找到了偶数大小的列表

有谁知道该怎么办?它不应该那么困难......

4 个答案:

答案 0 :(得分:10)

迭代哈希值:

for my $value (values %hash) {
  print $value;
}

答案 1 :(得分:3)

第一个示例中的

$line是标量,而不是哈希值。

如果是哈希引用,请使用%{$line}取消引用。

答案 2 :(得分:3)

首先,您必须了解散列和散列引用之间的区别。

您的初始赋值$_[0]->[0]表示类似于:获取当前函数的第一个参数($_[0]),取消引用它(->)并认为它是一个数组并首先检索它值([0])。该值不能是列表或散列,它必须是标量(字符串,整数,浮点数,引用)。

以下是一些例子:

my %hash = ( MyKey => "MyValue");
my $hashref = \%hash;
# The next line print all elements of %hash
foreach (keys %hash) { print $_ }
# And is equivalent to
foreach (keys %{$hashref}) { print $_ }
$hash{MyKey} == $hashref->{MyKey}; # is true

有关详细信息,请参阅http://perldoc.perl.org/perlreftut.html

答案 3 :(得分:1)

警告告诉您$_[0]->[0] nothing 。它并没有死亡并且告诉你你没有索引,所以$_[0]可能是一个arrayref,但是第一个插槽中没有任何内容 - 或者它可能指向一个空数组。

  • 如果它是一个空字符串或0,它不会抱怨。
  • 那里有任何参考,你可以打印一些东西,即使只是:BLAH(0x80af74)。 (其中“BLAH”是“ARRAY”,“HASH”,“SCALAR”,“REF”,“GLOB”,“IO”之一,...)

我的建议是你这样做:

use Data::Dumper;
say Data::Dumper->Dump( [ $_[0] ] ); # or even say Data::Dumper->Dump( [ \@_ ] )

然后查看输出。

一旦你在$_[0]->[0]得到一个hashref,那么如果你必须遍历哈希,最好的方法是:

while ( my ( $key, $value ) = each %$hashref ) { 
   do_stuff_with_key_and_value( $key, $value );
}

请参阅each

最后,似乎你有一些印记混乱。请参阅此链接的最后一部分,以便尝试解释这些符号('$''@''%'不是变量名称的一部分,但指标我们想要从中检索。 Perl compilation woes