2011-07-14 129 views
3

我使用這個scrub函數來清理其他函數的輸出。如何避免未初始化的值?

#!/usr/bin/perl 
use warnings; 
use strict; 
use Data::Dumper; 

my %h = (
    a => 1, 
    b => 1 
    ); 

print scrub($h{c}); 

sub scrub { 
    my $a = shift; 

    return ($a eq '' or $a eq '~' or not defined $a) ? -1 : $a; 
} 

的問題發生時,我也想處理的情況下,其中,在散列密鑰不存在,其被示出在例如用scrub($h{c})

scrub應該做些什麼改變才能處理這種情況?

+0

'現在的問題是,我想也應該能夠處理案件'? – marto

+0

謝謝。現在糾正了。 –

+0

最好避免使用'$ a'作爲變量名稱。 – Zaid

回答

6

您正在檢查$a eq ''在檢查它是否被定義之前,因此警告「在字符串eq中使用未初始化的值」。簡單地改變事物的秩序在有條件的:在鏈「或的比賽一旦

return (!defined($a) or $a eq '' or $a eq '~') ? -1 : $a; 

的東西,Perl將停止處理的條件,從而避免了錯誤的嘗試比較民主基金爲字符串。

+0

非常好解決=) –

+0

定義或也很方便。 $ a // =''如果當前未定義,則將$ a設置爲''。那麼你不需要擔心隨後的定義。 –

+0

該術語是* [短路評估](https://en.wikipedia.org/wiki/Short-circuit_evaluation)*。 –

-1

scrub檢查是否太晚,如果散列有一個條目key。如果散列鍵不存在,則scrub()只會看到一個標量,即undef。但是哈希也可能和價值undef也是入口,就像這樣:

my %h = (
a => 1, 
b => 1, 
c => undef 
); 

因此,我建議,以檢查是否與exists功能散列條目。

+1

這是不正確的。嘗試接受的解決方案。 –

+0

因此,您不希望檢查是否存在散列條目。我以爲你是。它與檢查值的「定義」不同。如果你從一個不存在的密鑰散列讀取,你會得到'undef'。但是我的例子中的$ h {c}也會給出'undef',儘管鍵'c'存在。所以這些情況是無法區分的。如果有不正確的地方,請說明一下。 – hexcoder

相關問題