2017-05-25 61 views
4

對不起,如果這是一個錯誤的標題。perl:從包含引用的散列中打印出一個字符串

我有以下散列:

my %map = (
    'key1', 'hello', 
    'key2', \'there' 
); 
print Dumper(\%map); 

輸出:

$VAR1 = { 
    'key2' => \'there', 
    'key1' => 'hello' 
}; 

我想在'key2'打印出來的值。以下是我已經試過:

print "$map{key2}" => SCALAR(0x2398b08) 
print "$$map{key2}" => 
print "$map->{key2}" => 

我的目標:

print [some magic thing] => there 

我是新來PERL,所以我不是100%清楚還在引用的行爲,以及如何取消引用它們。我如何得到我要找的東西?

+1

你也可以使用'ref'測試它是否是一個參考,到什麼 – zdim

回答

5

$map{key2}是一個標值\'there'一個參考,所以你需要取消對它的引用

$$map{key2}$map->{key2}雙方對待$map作爲參考哈希,但它甚至不存在,因此這是錯誤的

必須使用括號來消除歧義評估順序

${ $map{key2} } 

是你想要的。或者你可以把它寫在兩個步驟

my $val = $map{key2}; 
print $$val, "\n"; 
+0

因此,在此背景下,大括號像括號來表示的操作順序,正確嗎?換句話說,雙美元'$$'是通常取消引用變量的正確方法,但由於它是散列,所以順序不明確,因此perl取消了錯誤的引用。 – ewok

+1

@ewok:好吧,我不應該使用*含糊*。 '$$ map {key2}'定義爲'$ {$ map} {key2}',所以它使用'$ map'作爲散列引用。這不是你想要的事實並不能使它「錯誤」。 – Borodin

-2

我喜歡下面的行添加到我的Perl腳本:
use strict;
這將讓你擺脫困境與變量的作用域。它確實要求你用最少的「我的」來確定你的變量的範圍。

以下將讓您直接打印與「key2」相關聯的散列值(
),而不需要先將其複製到另一個變量的中間步驟。

print ${$map{'key2'}}, "\n";

+2

歡迎來到StackOverflow並感謝您的幫助。你測試了你的答案嗎?我想你可能錯過了「key2」的值是一個參考點。您的代碼適用於「key1」,但需要另外轉換「key2」。 – Yunnosch

+0

好,我發現我的測試代碼不正確。我在我的%地圖定義中有以下內容: ''key2','\'there'' 我解決了這個問題,並更新了我的答案! – mcfaddyone

相關問題