List::MoreUtils有一个调用的函数any
,它使用类似于 的语法grep
,但在第一次满足条件时停止其内部循环。这种行为的优点是需要的迭代次数要少得多(假设交叉点的随机分布)。
另一个优点any
是代码清晰:它以它的作用命名。Perl 最佳实践不鼓励grep
在布尔上下文中使用,因为假定使用 forgrep
是返回匹配的元素列表。它在布尔上下文中工作,但对于读者来说,代码的意图不如any
专门为布尔使用而设计的那样清楚。
确实any
添加了对 List::MoreUtils 的依赖。然而,List::MoreUtils 是那些无处不在的模块之一,它很可能已经安装了。
这是一个例子:
use List::MoreUtils qw( any );
my %foo = ( foo => 1, bar => 1 );
my @cmp0 = qw( foo baz );
my @cmp1 = qw( baz blargh );
print "\@cmp0 and %foo have an intersection.\n"
if any { exists $foo{$_} } @cmp0;
print "\@cmp1 and %foo have an intersection.\n"
if any { exists $foo{$_} } @cmp1;
另一个选项是~~
Smart Match Operator,它在 Perl 5.10.0 和更新版本中可用。它可以这样使用:
my %foo = ( foo => 1, bar => 1 );
my @cmp0 = qw( foo baz );
my @cmp1 = qw( baz blargh );
print "\@cmp0 and %foo have an intersection.\n" if @cmp0 ~~ %foo;
print "\@cmp1 and %foo have an intersection.\n" if @cmp1 ~~ %foo;
使用 smartmatch,您消除了 List::MoreUtils 依赖,取而代之的是最小的 Perl 版本依赖。代码是否像any
.