在 Perl 中打印哈希值

Printing hash value in Perl

当我打印一个变量时,我得到一个 HASH(0xd1007d0) 值。我需要打印所有键和值的值。但是,我不能,因为控件没有进入循环。

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

}

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

我不能完全回答,因为这完全取决于 $HashVariable 中的内容。

分辨其中内容的最简单方法是:

use Data::Dumper;
print Dumper $HashVariable;

假设这是一个散列 reference - 如果 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

例如:

my %HashVariable;
$HashVariable{'test'} = "foo";

这里有一个明显的问题,但它不会导致您看到的行为。

您认为您在 $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) 输出但没有循环迭代)的唯一方法是如果您有哈希引用但哈希没有键。

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