它很糟糕,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代码?
每个人似乎都忘记了他们可以编写潜艇以隐藏"糟糕"的细节.
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试图解决的问题.
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |