2017-07-25 104 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

相關問題