我有一个哈希,让我们说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中找到了偶数大小的列表
有谁知道该怎么办?它不应该那么困难......
答案 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,但是第一个插槽中没有任何内容 - 或者它可能指向一个空数组。
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