2010-11-10 105 views
1

我有一个散列,让我们说20个值。在perl中迭代哈希值

它的初始化是这样的:

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

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

现在,当我试图让在$行每个哈希值,它说:在file.pl行打印 使用未初始化值的89

有没有一种方法来迭代散列的每个值?

我也试了一下:

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

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

但是,这也不能正常工作: 参考发现,甚至大小列表预期file.pl在行89

任何人知道该怎么办?它应该不是那么难...

+0

我很困惑。当然,你看起来像你已经初始化了一个标量,而不是哈希。 – Cascabel 2010-11-10 14:47:06

+0

在你的第二个例子中,你试图使它成为一个散列,但你仍然分配一个标量 - 也许它是一个散列ref? – Cascabel 2010-11-10 14:49:08

+0

使用Perl调试器并使用'x'命令打印出你的arglist。 – tchrist 2010-11-10 15:07:17

回答

3

$line在你的第一个例子中是一个标量,而不是散列。

如果是散列引用,请将其与%{$line}对照。

+1

啊我明白了!现在可以使用: my $ line = $ _ [0] - > [0]; \t \t foreach my $ value(values%{$ line}){ \t \t print $ value。 “\ n” 个; \t} – baklap 2010-11-10 14:51:15

9

遍历值的哈希:

for my $value (values %hash) { 
    print $value; 
} 
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进一步的细节。

+0

不,'$ _ [0]'不是函数。这是'@ _'的第一个(标量)元素。所以'$ _ [0] - > [0]' - 与'$ _ [0] [0]'和'$ {$ _ [0]} [0]'相同 - 将第一个标量元素'@ _',将其解释为对数组的引用,并返回该推定引用数组的第一个元素。 – tchrist 2010-11-10 15:06:32

+0

永远不要说$ _ [0]是一个函数。 – 2010-11-10 15:19:05

1

警告告诉你,有什么都没有$_[0]->[0]。它不会死亡,并告诉你,你没有索引任何东西,所以$_[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

最后,看来你有一些印记混乱。看到这个链接的最后一部分,一个体面的尝试来解释,sigil('$','@','%')是而不是变量的名称的一部分,但指示我们想要从它中检索。 Perl compilation woes