2012-12-10 39 views
0

與小我知道Perl的,我很驚訝,這個語法不起作用:分配變量和校驗散列的存在關鍵

if (exists $wid = $dict{$w}) { 
print "$wid:$c\n"; 
} 

看來我不能進行分配$wid = $dict{$w}和檢查它是否存在在同一時間:

存在參數不是HASH或數組元素或在 createWordIndex.pl線的子程序31.

有沒有辦法做這種轉讓?或者我只需要首先檢查存在,然後在條件爲真的情況下進行分配?

回答

4

你打算在打印之前弄清楚是否有值嗎?然後,你就必須做這種方式:

if (exists($dict{$w})) { 
    my $wid = $dict{$w}; 
    print "$wid: $c\n"; 
} 

如果你知道存儲的值會一直被定義,你可以做

if (defined(my $wid = $dict{$w})) { 
    print "$wid: $c\n"; 
} 
0

你剛纔已經回答了你的問題在你的問題。

「或者我只需要首先檢查存在,然後在條件爲真時進行分配?」

存在於你的代碼函數採用標量$ WID。並且是在錯誤的存在功能需要一個散列或數組元素

存在的說法是不是哈希或數組元素或createWordIndex.pl線子程序31

所以是明確表示。你需要先檢查它是否存在。

友好的建議:嘗試所有的事情/解決方案,你可以想到之前問,因爲你可能已經知道你的問題的答案。 :)

1

或者(TIMTOWTDI,畢竟),你可以使用智能匹配運算符(Perl版本> = 5.10):

if($w ~~ (keys %dict)) 
{ 
    my $wid = $dict{$w}; 
    print "$wid: $c\n"; 
} 

,或者:

if(grep{$w eq $_}(keys %dict)) 
{ 
    my $wid = $dict{$w}; 
    print "$wid: $c\n"; 
} 
1

可以做到這一點,只需跳過exists即可。如果分配完成(因爲存在$ dict {$ w}),則副作用爲真。

my %dict; 

$dict{one} = 1; 
$dict{two} = 2; 
$dict{three} = 3; 

if ($wid = $dict{four}) { 
    print "$wid\n"; 
} 
else { 
    print "NO!\n"; 
} 
+0

有一個問題,如果'$ {字典} 4'存在,但它的價值是'0' – Toto

+0

@ M42 - 右邊,好點。 –