我正在使用以下代码。在and
的右侧是grep
,没有数字比较。这有意义吗?
if ( scalar( grep { $_ eq $ServerTypeId } keys %ServerTypes ) > 0
and grep { isRegionOK( $_, $DC ) == 1 } keys %$destinationSummary )
{
...
}
答案 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