2015-03-02 88 views
1

我有以下代碼:的Perl:測試哈希片不會產生預期的結果

if (defined(@hash{qw{value1 value2 value3}})){ 
    # code block 
} 

我希望發生的是代碼塊來執行,如果任一$ {散列值1} $ {哈希value2}或$ hash {value3}被定義。但是,什麼情況是,代碼塊執行,當且僅當$哈希{值3}定義:

$hash{value3}='yep, here!'; 
if (defined(@hash{qw{value1 value2 value3}})){ 
    print "yay!"; 
} 

輸出:

yay! 

但是:

$hash{value2}='yep, here!'; 
if (defined(@hash{qw{value1 value2 value3}})){ 
    print "yay!"; 
} 

輸出:

<nothing> 

爲什麼不能正常工作對,我該怎麼辦?

回答

2

perldoc -f defined沒有提到散片,並警告不會就此發出警告,但你想要的是,

if (grep defined, @hash{qw{value1 value2 value3}}) { 
    # code block 
} 

defined()力量標量上下文,在這種情況下,最後的回報元件。

use warnings; 

sub context { 
    print wantarray ? "LIST" : "SCALAR"; 
} 

my $def = defined(context()); 

輸出SCALAR

+1

美麗!謝謝。歸檔於「爲什麼我沒有想到這個?!」 – Bintz 2015-03-02 23:59:47

+0

「爲什麼這不起作用?」的答案是_ [[標量上下文中的切片返回切片的最後一項]](http://perldoc.perl.org/perldata.html#Slices)_(例如[list literals](http://perldoc.perl.org) /perldata.html#List-value-constructors))。 – pilcrow 2015-03-03 00:14:32

+0

@pilcrow tnx發表評論。 – 2015-03-03 00:22:22