避免在布尔上下文中grepping all

drv*_*iny 0 perl grep

它很糟糕,perl中的grep函数无法识别"布尔"上下文,因为在Perl中根本没有"布尔"上下文.

所以,如果我做这样的事情

print "matched\n" if grep { print "$_\n"; $_&1 } 1..31
Run Code Online (Sandbox Code Playgroud)

将打印从1到31的数字而不是仅打印"1",这足以在"if"中获得"true"结果.

为了避免这种行为,我必须做一些可怕的事情:

print "matched\n" if do { my $fl; $_&1 and $fl=1, last for 1..31; $fl }
Run Code Online (Sandbox Code Playgroud)

也许它可以用最简单的方式完成?是否有一些在CPAN上实现"布尔grep"的快速XS代码?

ike*_*ami 5

每个人似乎都忘记了他们可以编写潜艇以隐藏"糟糕"的细节.

sub any(&@) { my $cb = shift; for (@_) { return 1 if $cb->() } 0 }

say "match" if any { say; $_ & 1 } 1..31;
Run Code Online (Sandbox Code Playgroud)

也就是说,any已经由List :: Util提供了.(另请查看List :: MoreUtils.)

请注意,在调用之前,迭代的项目列表仍将完全放在堆栈上any.与不必要多次调用sub相比,这相当便宜,但它仍然可能是一个问题.我相信这是List :: Gen试图解决的问题.