在Perl中打印哈希值

时间:2017-05-03 07:42:35

标签: perl loops hash foreach key-value

当我打印变量时,我得到HASH(0xd1007d0)值。我需要打印所有键和值的值。但是,我无法控制不进入循环。

foreach my $var(keys %{$HashVariable}){
    print"In the loop \n";
    print"$var and $HashVariable{$var}\n";

}

但控制甚至没有进入循环。我是perl的新手。

2 个答案:

答案 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)输出但没有循环的迭代)是你有一个哈希引用但哈希没有键。

所以(正如我在评论中所说)我们需要看看你的哈希引用是如何创建的。