#arrays #perl #arraylist #multidimensional-array
Вопрос:
Я пытаюсь удалить элемент из массива массива, который имеет значение undef.
Я хочу, чтобы результат был:
@list = [
[
2,
""
],
[
4,
""
],
[
6,
""
],
[
8,
""
],
[
10,
""
],
];
Это то, что я пытался удалить undef из массива. Я извлекаю определенный элемент из массива, но он не работает
use Data::Dumper;
my @list = [
[
undef,
""
],
[
2,
""
],
[
4,
""
],
[
6,
""
],
[
8,
""
],
[
10,
""
],
];
@list = grep defined, @list;
print Dumper(@list);
Может кто-нибудь, пожалуйста, помочь ?
Заранее спасибо
Комментарии:
1. Для начала массивы инициализируются с
@array = ( ... )
помощью, не@array = [ ... ]
. У вас есть одноэлементный массив, и один элемент является ссылкой на ваш фактический массив.
Ответ №1:
Люди часто путают списки и массивы в Perl. Так что вызов переменной массива @list
-действительно плохая идея: -)
Как я уже упоминал в комментарии, вы, похоже, смущены тем, как вы заполняете массив в Perl. Вы либо заполняете его списком:
my @array = ( ... ); # Lists use parentheses
Или вы создаете анонимный массив и сохраняете ссылку на этот массив в скалярной переменной:
my $array_ref = [ ... ]; # Anon array uses square brackets
Далее, ваш массив не содержит undef
элементов. Каждый элемент в вашем массиве является ссылкой на двухэлементный массив. В одном из этих массивов второго уровня первым элементом является undef
. Вы правильно используете grep
для фильтрации массива, но вам нужно посмотреть на массив второго уровня, чтобы сделать то, что вы хотите.
Таким образом, код будет выглядеть примерно так:
my @array = ( ... );
@array = grep { defined $_->[0] } @array;
Обратите внимание, что я переключился на синтаксис блока grep
. Это наиболее часто используемая версия, и, вероятно, лучше всего использовать этот синтаксис.