2011-08-24 9 views
7

私はnoneサブルーチンList::MoreUtilsは記載どおりに動作しないと思います。ドキュメントによると、List :: MoreUtils :: noneバグですか?

なしブロックリスト論理的には否定です。 LIST内の項目がBLOCK、、またはLIST が空の場合で指定された条件を満たさない場合は真の値を返します。

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"; 
} 

はOK動作しますが、空1(my @arr =();または単にmy @arr;)で@arrを交換し、間違った答えを得る:今すぐ

今度

にリストの各項目のための$ _を設定し、試してみてください。

何が起こっているのですか?

更新:List :: MoreUtils ver 0.22を持っていました。最新のものに更新され、OKと思われます。奇妙だけど!

+2

を提供 - のための私の答え – Zaid

答えて

9

ドキュメントはv 0.33の純粋なPerl implementationと一致しています。それが失敗した理由は、実装がバージョン0.22と0.33の間で変更されたためです。

v0.33では、@arrayが空の場合、forループは実行されないため、YESが返されます。ここで

には2つのバージョンのサイドバイサイドです:

# 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も実装がバージョン0.22と最新の間で変更comprehensive diff between versions 0.22 and 0.33

+3

クールな使用を見ますSO構文の強調表示=>サイドバイサイドコードの比較:) – Zaid

関連する問題