为什么可以在布尔上下文中评估`defined $ x && $ x`?

Cha*_*hak 3 perl boolean operators

my $target_type = (defined($item->{target_type}) && $item->{target_type}) 
                ? $item->{target_type} 
                : "";

my $target_id   = (defined($item->{target_id}) && $item->{target_id})
                ? $item->{target_id} 
                : "";
Run Code Online (Sandbox Code Playgroud)

为什么开发人员使用&&几乎相同的条件?

cjm*_*cjm 6

显然他是腰带和吊带类型. (defined($x) && $x)几乎等同于$x,因为undef是假的.(所不同的是,如果$xundef(defined($x) && $x)将是Perl的特殊假值,其被定义,但在这种情况下,使没有什么区别.)可能有曾经是一个不同的条件(如$x > 0)和defined测试是必要的,以避免关于警告未初始化的价值.然后有人删除了这个条件,并没有想到删除现在不必要的defined.

使用(defined($x) && $x)(如onon15指出)的另一个原因是强调未来$x可能没有定义的维护程序员.就个人而言,我会使用评论,但TIMTOWTDI.