2015-03-02 71 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