#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
];