grep作为布尔值的结果

时间:2014-11-29 17:18:42

标签: perl

我正在使用以下代码。在and的右侧是grep,没有数字比较。这有意义吗?

if ( scalar( grep { $_ eq $ServerTypeId } keys %ServerTypes ) > 0
    and grep { isRegionOK( $_, $DC ) == 1 } keys %$destinationSummary )
{
    ...
}

1 个答案:

答案 0 :(得分:3)

与C一样,Perl没有布尔类型。该语言将某些值定义为false,其余值为true。请参阅How do I use boolean variables in Perl?Truth and Falsehood

在标量上下文中,grep返回匹配计数。 0为false且所有其他数字都为true,因此将grep的结果视为布尔值会检查是否存在任何匹配项。所以是的,grep可以很好地用作and的参数。


让我们做一些清理。

您有以下内容:

scalar( grep { $_ eq $ServerTypeId } keys %ServerTypes ) > 0
and
grep { isRegionOK( $_, $DC ) == 1 } keys %$destinationSummary

检查非负数是否大于零与检查它是真还是假相同。

scalar( grep { $_ eq $ServerTypeId } keys %ServerTypes )
and
grep { isRegionOK( $_, $DC ) == 1 } keys %$destinationSummary )

and(以及之前的>)在标量上下文中评估其参数,因此不需要scalar

grep { $_ eq $ServerTypeId } keys %ServerTypes
and
grep { isRegionOK( $_, $DC ) == 1 } keys %$destinationSummary

isRegionOK region肯定会返回一个布尔值。

grep { $_ eq $ServerTypeId } keys %ServerTypes
and
grep { isRegionOK( $_, $DC ) } keys %$destinationSummary

exists在按密钥检查哈希元素是否存在方面效率更高。

exists($ServerTypes{$ServerTypeId})
and
grep { isRegionOK( $_, $DC ) } keys %$destinationSummary