2017-07-25 101 views
-1

我有一个Perl散列(来自一些遗留代码),但无法打印出键。Perl:引用键参数的类型必须是未散列的hashref或arrayref

if (ref $val eq ref {}) { 
    print "Keys: " . keys $val . "\n"; 

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

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

我读过这Type of argument to keys on reference must be unblessed hashref or arrayref,但不知道如何在这种情况下应用它。

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

====

UPDATE

我也试过:

print "Keys: " . keys %$val . "\n"; 

但仍获得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 

更新3

在REPL我得到使用Data::Dumper

所有的
$ 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. 
+0

@ikegami你能详细点吗? – Snowcrash

+0

我刚刚重新运行代码并得到相同的错误消息。 – Snowcrash

+1

'.'设置标量上下文,但是当你修复这个'print'键时:“,键(%$ href),”\ n“;'你会将所有键连接成一个单词。您可以为键%$ href;执行'print“$ _”。打印“\ n”;',或每行一个'说键%$ href;' – zdim

回答

6

首先,你有一个优先问题。你正在做

keys($val . "\n") 

代替

keys($val) . "\n" 

其次,语法keys[1]

keys HASH 

这意味着你需要

keys(%$val) 

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

say "Keys: ", join ", ", keys(%$val); 

  1. 有其中的Perl试行允许keys $ref了几个版本,但实验是在5.24停产。避免这种情况!
+0

我试过'%$ val',但结果相同。 – Snowcrash

+0

我的歉意。更新了答案。 – ikegami

+0

这是标量的背景,是咬我。 '打印“键:”; 打印键($ val); print“\ n”;'为我工作。 – Snowcrash

相关问题