Удалить undef в массиве массива в Perl

#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 . Это наиболее часто используемая версия, и, вероятно, лучше всего использовать этот синтаксис.