Perl:引用键的参数类型必须是非散列的hashref或arrayref

Sno*_*ash -1 perl hash reference

我有一个Perl哈希(来自一些遗留代码)但我无法打印出密钥.

  if (ref $val eq ref {}) {
    print "Keys: " . keys $val . "\n";
Run Code Online (Sandbox Code Playgroud)

例如,这是我得到的输出:

VAL: HASH(0x7ff0898eda70)
Type of argument to keys on reference must be unblessed hashref or arrayref
Run Code Online (Sandbox Code Playgroud)

我已经读过这个参数类型的参数必须是unblessed hashref或arrayref但不知道如何在这种情况下应用它.

有没有办法解决这个问题?

====

UPDATE

我也尝试过:

    print "Keys: " . keys %$val . "\n";
Run Code Online (Sandbox Code Playgroud)

但仍然得到 Type of argument to keys on reference must be unblessed hashref or arrayref

更新2

我可以看到我有钥匙,a_key但我无法打印出它的价值.例如调试Carp::REPL我得到:

$ print $val;
1$ HASH(0x7fb1e0828f00)    
$ print %$val;
1$ a_keyARRAY(0x7fb1e0828e28)
$ print %$val{'a_key'}
Compile error: syntax error at (eval 412) line 63, near "$val{"
BEGIN not safe after errors--compilation aborted at (eval 412) line 63, <FIN> line 6.
$ print $val{'a_key'}
Use of uninitialized value in print at (eval 413) line 63, <FIN> line 7.
1
Run Code Online (Sandbox Code Playgroud)

更新3

Data::Dumper在REPL中使用我得到:

$ print Dumper( $val );
$VAR1 = {
          'a_key' => [
                     'long_value'
                   ]
        };
1$ print Dumper( %$val );
$VAR1 = 'a_key';
$VAR2 = [
          'long_value'
        ];
1$ print %$val[1]
Compile error: syntax error at (eval 450) line 63, near "$val["
BEGIN not safe after errors--compilation aborted at (eval 450) line 63, <FIN> line 44.
$ print %$val{'a_key'}
Compile error: syntax error at (eval 451) line 63, near "$val{"
BEGIN not safe after errors--compilation aborted at (eval 451) line 63, <FIN> line 45.
$ print $val[1]     
Use of uninitialized value in print at (eval 452) line 63, <FIN> line 46.
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 6

首先,您有一个优先问题.你在做

keys($val . "\n")
Run Code Online (Sandbox Code Playgroud)

代替

keys($val) . "\n"
Run Code Online (Sandbox Code Playgroud)

其次,[1]的语法是keys

keys HASH
Run Code Online (Sandbox Code Playgroud)

意味着你需要

keys(%$val)
Run Code Online (Sandbox Code Playgroud)

最后,您keys在标量上下文中调用,该上下文返回散列中的键数.在列表上下文中调用它以获取哈希的键.例如,

say "Keys: ", join ", ", keys(%$val);
Run Code Online (Sandbox Code Playgroud)
  1. 有几个版本的Perl实验允许keys $ref,但实验在5.24中停止.避免这样!