Perl:测试哈希切片并不能产生预期的结果

时间:2015-03-02 23:44:22

标签: perl hash

我有以下代码:

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

我想要发生的是,如果定义了$ hash {value1},$ hash {value2}或$ hash {value3},则执行代码块。但是,当且仅当定义$ hash {value3}时,代码块才会执行:

$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>

为什么这不正常,我该怎么办?

1 个答案:

答案 0 :(得分:2)

perldoc -f defined没有提及哈希切片,警告并没有警告你这个,但你想要的是,

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

作为defined()强制标量上下文, slices 在这种情况下返回最后一个元素。

use warnings;

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

my $def = defined(context());

输出SCALAR