Как grep неопределенные значения в массиве?

#perl

#perl

Вопрос:

У меня есть массив с неопределенным значением:

 [0] 0.1431,
[1] undef
  

Затем я помещаю это значение в массив, и Perl не предупреждает меня о неинициализированных значениях (я не могу представить, почему кто-то хотел бы, чтобы это произошло без предупреждения или die , даже когда я use autodie ':all' установил, но это уже другая история)

Поэтому я пытаюсь и grep в этих массивах предотвратить перенос undef значений в массивы, таким образом:

 if (grep {undef} @array) {
    next
}
  

Но это не улавливает значение.

Как я могу grep использовать неопределенные значения в Perl5?

Комментарии:

1. Re » Но это не улавливает значение». , undef не проверяет, является ли что-то неопределенным; это делает вещи неопределенными и / или возвращает неопределенный скаляр (в зависимости от того, как он используется)

2. Повторите » даже когда я use autodie ':all' установил «, push не может произойти сбой, поэтому концепция создания его die при сбое не имеет смысла.

3. Правильное построение кода next unless defined $var;

Ответ №1:

grep вместо не определено:

 use warnings;
use strict;

my @array = (0, undef, undef, 3);

if (grep {! defined} @array) {
    print "undefined values in arrayn";
}
  

Существует несколько причин, по которым вы хотели бы иметь / разрешать неопределенные значения в массиве. Одним из таких полезных сценариев является передача позиционных параметров в функцию.

Ответ №2:

Почему бы не запретить добавление значений в первую очередь?

Заменить

 push @array, LIST;
  

с

 push @array, grep defined, LIST;
  

Если это конкретно скаляр, вы также можете использовать

 push @array, $scalar if defined($scalar);
  

Ответ №3:

Вы можете использовать defined, чтобы избавиться от неопределенных элементов:

 use warnings;
use strict;
use Data::Dumper;

my @a1 = (1,2,3,undef,undef,4);
print Dumper(@a1);

my @a2 = grep { defined } @a1;
print Dumper(@a2);
  

Вывод:

 $VAR1 = [
          1,
          2,
          3,
          undef,
          undef,
          4
        ];
$VAR1 = [
          1,
          2,
          3,
          4
        ];