是List :: MoreUtils :: none越野车?

时间:2011-08-24 13:08:41

标签: perl list

我认为来自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。更新到最新版本似乎没问题。虽然很奇怪!

1 个答案:

答案 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