Список :: MoreUtils :: нет ошибок? - PullRequest
7 голосов
/ 24 августа 2011

Я думаю, что подпрограмма none из List::MoreUtils не работает, как описано. Согласно документации,

none BLOCK LIST Логически отрицание любого. Возвращает истинное значение, если ни один элемент в 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";
}

работает нормально, но замените @arr пустым (my @arr = (); или просто my @arr;), и вы получите неправильный ответ.

Что происходит?

обновление: у меня был List :: MoreUtils ver 0.22. Обновлено до последней и, кажется, ОК. Странно, хотя!

1 Ответ

9 голосов
/ 24 августа 2011

Документация соответствует реализации Perl v 0.33 pure . Причина, по которой это не удалось, заключалась в том, что реализация изменилась между версиями 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 также предоставляет полный дифференциал между версиями 0.22 и 0.33

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...