当我打印变量时,我得到HASH(0xd1007d0)
值。我需要打印所有键和值的值。但是,我无法控制不进入循环。
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable{$var}\n";
}
但控制甚至没有进入循环。我是perl的新手。
答案 0 :(得分:3)
我无法完全回答,因为它完全取决于$HashVariable
中的内容。
告诉其中的最简单方法是:
use Data::Dumper;
print Dumper $HashVariable;
假设这是一个哈希引用 - 如果print $HashVariable
给出HASH(0xdeadbeef)
作为输出,那么它就是这样。
所以这个应该工作:
#!/usr/bin/env perl
use strict;
use warnings;
my $HashVariable = { somekey => 'somevalue' };
foreach my $key ( keys %$HashVariable ) {
print $key, " => ", $HashVariable->{$key},"\n";
}
你所犯的唯一错误是$HashVariable{$key}
不起作用 - 你需要取消引用,因为它指的是%HashVariable
而不是$HashVariable
这两个是完全不同的的东西。
否则 - 如果它没有进入循环 - 这可能意味着keys %$HashVariable
没有返回任何东西。这就是Dumper
测试有用的原因 - 您是否有可能无法正确填充它,或者您正在写而不是%HashVariable
。
E.g:
my %HashVariable;
$HashVariable{'test'} = "foo";
答案 1 :(得分:2)
这里有一个明显的问题,但它不会导致你所看到的行为。
您认为在$HashVariable
中有一个哈希引用,并且根据您在打印时看到的HASH(0xd1007d0)
输出,这听起来是正确的。
但是设置哈希引用并运行代码会产生一些奇怪的结果:
my $HashVariable = {
foo => 1,
bar => 2,
baz => 3,
};
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable{$var}\n";
}
我得到的输出是:
In the loop
baz and
In the loop
bar and
In the loop
foo and
请注意,这些值不会被打印出来。这是因为我上面提到的问题。将use strict
添加到程序中(您应该总是这样做)告诉我们问题所在。
Global symbol "%HashVariable" requires explicit package name (did you forget to declare "my %HashVariable"?) at hash line 14.
Execution of hash aborted due to compilation errors.
您正在使用$HashVariable{$var}
在哈希中查找密钥。如果你有一个名为%HashVariable
的哈希值,那就没错了 - 但是你没有 - 你有一个名为$HashVariable
的哈希引用(请注意$
而不是%
)。要从哈希引用中查找键,您需要使用解除引用箭头 - $HashVariable->{$var}
。
修复此问题,您的程序按预期工作。
use strict;
use warnings;
my $HashVariable = {
foo => 1,
bar => 2,
baz => 3,
};
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable->{$var}\n";
}
我明白了:
In the loop
bar and 2
In the loop
foo and 1
In the loop
baz and 3
你可以获得你描述的结果的唯一方法(HASH(0xd1007d0)
输出但没有循环的迭代)是你有一个哈希引用但哈希没有键。
所以(正如我在评论中所说)我们需要看看你的哈希引用是如何创建的。