Как склеить массив, который находится в хэш-массивах? - PullRequest
0 голосов
/ 06 июня 2019

Я заполняю структуру данных следующим образом: -

push @{$AvailTrackLocsTop{$VLayerName}}, $CurrentTrackLoc;

Где $ VLayerName - строка типа m1, m2, m3 и т. Д., А $ CurrentTrackLoc - просто десятичное число.Если я использую Data :: Dumper для печати содержимого хеша после его полного заполнения, он показывает, что я ожидаю, например: -

$VAR1 = {
      'm11' => [
                 '0.228',
                 '0.316',
                 '0.402',
                 '0.576',
                 '0.750',
                 '569.458',
                 '569.544',
                 '569.718',
                 '569.892'
               ]
    };

Теперь мне нужно эффективно склеить сохраненный список десятичных чисел,Я могу удалить записи, например, так: -

for (my $i = $c; $i <= $endc; $i++) {
    delete $AvailTrackLocsTop{$VLayerName}->[$i];
}

Результатом, как и ожидалось, является набор "undef" записей, где раньше существовали числа, например: -

$VAR1 = {
      'm11' => [
                 undef,
                 undef,
                 undef,
                 undef,
                 '0.750',
                 '569.458',
                 '569.544',
                 '569.718',
                 '569.892'
               ]
    };

НоКак я могу удалить записи undef так, чтобы вместо этого я увидел что-то подобное?

$VAR1 = {
      'm11' => [
                 '0.750',
                 '569.458',
                 '569.544',
                 '569.718',
                 '569.892'
               ]
    };

Важно отметить, что удаления могут быть где угодно в массиве, например, как индексы 33 и 99 из 100.легко склеивать массивы вне контекста хеш-структуры, но я изо всех сил пытаюсь манипулировать массивом, когда он встроен в большой хеш.

Ответы [ 2 ]

5 голосов
/ 06 июня 2019

Во-первых, я хочу отметить из документации delete :

WARNING: Calling delete on array values is strongly discouraged. The notion of deleting or checking the existence of Perl array elements is not conceptually coherent, and can lead to surprising behavior.

Правильный способ установить элемент массива на undef с помощью функции undef (или просто присваивая ему undef).

Чтобы вместо этого удалить элементы, вы можете использовать функцию splice , она работает на вложенных массивах как и в обычном массиве, простонужно разыменовать это, как вы сделали для push.

splice @{$AvailTrackLocsTop{$VLayerName}}, $c, $endc - $c + 1;
1 голос
/ 06 июня 2019

Вероятно, вам легче всего восстановить массивы без undefs:

$_ = [ grep defined, @$_ ] for values %AvailTrackLocsTop;

В качестве альтернативы, вместо хэша массивов, вы можете иметь хэш хэшей, и тогда удаление приведет к их исчезновению, не обращаясь в undef. Вы просто потеряете заказ, если это имеет значение.

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