的Perl:测试哈希片不会产生预期的结果
问题描述:
我有以下代码:的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>
为什么不能正常工作对,我该怎么办?
答
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
美丽!谢谢。归档于“为什么我没有想到这个?!” – Bintz 2015-03-02 23:59:47
“为什么这不起作用?”的答案是_ [[标量上下文中的切片返回切片的最后一项]](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
@pilcrow tnx发表评论。 – 2015-03-03 00:22:22