【问题标题】:Printing hash value in Perl在 Perl 中打印哈希值
【发布时间】:2017-09-30 22:21:44
【问题描述】:

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

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

}

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

【问题讨论】:

  • 您正在引用标量中的哈希?
  • 如果变量$HashVariable 确实是一个hashref,唯一的可能就是它是空的,没有任何键。否则代码会进入循环。
  • 你能分享一下从哪里得到的哈希
  • 向我们展示print Dumper($HashVariable);的输出
  • @emma:我们真的需要看看变量$HashVariable是如何构造的。否则,我们所有的答案都是猜测。

标签: perl loops hash foreach key-value


【解决方案1】:

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

判断里面有什么的最简单方法是:

use Data::Dumper;
print Dumper $HashVariable;

假设这是一个散列 reference - 如果print $HashVariableHASH(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";

【讨论】:

    【解决方案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) 输出但没有循环迭代)是如果您有哈希引用但哈希没有键。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 2016-12-18
      • 2011-10-27
      • 2012-10-23
      • 1970-01-01
      • 2016-02-21
      • 2012-08-10
      相关资源
      最近更新 更多