我认为来自none
的{{1}}子程序没有按照描述行事。根据文件,
none BLOCK LIST逻辑上否定任何。如果返回true值 LIST中的任何项目都不符合通过BLOCK,或LIST给出的标准 是空的。依次为LIST中的每个项目设置$ _
现在,试试:
List::MoreUtils
工作正常,但将use strict;
use warnings;
use 5.012;
use List::MoreUtils qw(none);
my @arr = ( 1, 2, 3 );
if ( none { $_ == 5 } @arr ) {
say "none of the elements in arr equals 5";
}
else {
say "some element in arr equals 5";
}
替换为空@arr
或简称为my @arr = ();
),并得到错误答案。
发生了什么事?
更新:我有List :: MoreUtils ver 0.22。更新到最新版本似乎没问题。虽然很奇怪!
答案 0 :(得分:9)
文档符合v 0.33纯Perl implementation。它失败的原因是因为版本0.22和0.33之间的实现发生了变化。
在v 0.33中,如果@array
为空,则for
循环将不会执行,因此将返回YES
。
以下是两个版本并排:
# v 0.33 | # v 0.22
------------------------------+----------------------------------------
sub none (&@) { | sub none (&@) {
my $f = shift; | my $f = shift;
foreach ( @_ ) { | return if ! @_; # root cause
return NO if $f->(); | for (@_) {
} | return 0 if $f->();
return YES; | }
} | return 1;
| }
MetaCPAN
还提供comprehensive diff between versions 0.22 and 0.33