2011-08-24 13 views
7

मुझे लगता है कि noneList::MoreUtils से subroutine वर्णित के रूप में कार्य नहीं करता है। प्रलेखन के अनुसार,सूची है :: MoreUtils :: कोई भी छोटी गाड़ी नहीं?

कोई भी ब्लॉक सूची तर्कसंगत रूप से किसी की अस्वीकृति नहीं। LIST में कोई आइटम ब्लॉक, के माध्यम से दिए गए मानदंड को पूरा करता है या यदि 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"; 
} 

ठीक काम करता है, लेकिन एक खाली एक (my @arr =(); या बस my @arr;) के साथ @arr की जगह है और आप एक गलत जवाब मिलता है।

क्या चल रहा है?

अपडेट: मेरे पास सूची :: MoreUtils ver 0.22 थी। नवीनतम में अपडेट किया गया और यह ठीक लगता है। हालांकि अजीब!

+2

कार्यान्वयन संस्करण 0.22 के बीच बदल गया है और नवीनतम - के लिए मेरा उत्तर – Zaid

उत्तर

9

प्रलेखन v 0.33 शुद्ध पर्ल implementation के साथ लाइन में है। इसका असफल कारण यह था क्योंकि कार्यान्वयन संस्करण 0.22 और 0.33 के बीच बदल गया था।

वी 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

+3

कूल उपयोग देख SO वाक्यविन्यास हाइलाइटिंग => साइड-बाय-साइड कोड तुलना :) – Zaid

संबंधित मुद्दे