Хеши Массива в Perl: обход и удаление

как может я удалять элемент из следующего хеша массивов;

%HoA = (
    flintstones    => [ {day=>'19'}, {day=>'21'}, {day=>'22'} ],
    jetsons        => [ {day=>'29'}, {day=>'23'}, {day=>'25'} ],
    simpsons       => [ {day=>'26'}, {day=>'33'}, {day=>'27'} ]
);

Как то, как я могу удалить, например, {day=>'21'} от flintstones и заставьте результат быть похожим;

%HoA = (
    flintstones    => [ {day=>'19'}, {day=>'22'} ],
    jetsons        => [ {day=>'29'}, {day=>'23'}, {day=>'25'} ],
    simpsons       => [ {day=>'26'}, {day=>'33'}, {day=>'27'} ]
);

Я попытался использовать Хеш = (); но это приводит к undef, вместо элемента, который я удаляю

5
задан bilal 3 March 2010 в 06:19
поделиться

5 ответов

Если вы знаете, что хотите удалить элемент [1] из массива кремневых камней, вы можете напрямую использовать splice :

splice @{$HoA{flintstones}}, 1, 1;

Если вы просто знаете, что хотите удалить элементы, у которых день = 21, используйте grep либо таким образом:

$HoA{flintstones} = [ grep { $_->{day} != 21 } @{$HoA{flintstones}} ];

Или лучше, как предлагает ответ Шона:

@{$HoA{flintstones}} = grep { $_->{day} != 21 } @{$HoA{flintstones}};
10
ответ дан 18 December 2019 в 10:44
поделиться

Используйте функцию delete для удаления определенного элемента из хэша.

delete $HoA{flintstones}->[1];

0
ответ дан 18 December 2019 в 10:44
поделиться

Итерация по ключам %HoA, применение grep к каждому из массивов (вам придется снять с них ссылки с помощью @{$HoA{$key}}), сохранение ссылок на результаты обратно в $HoA{$key}.

2
ответ дан 18 December 2019 в 10:44
поделиться

delete $ {$ {$ HoA {flintstones}} [1]} {day};

0
ответ дан 18 December 2019 в 10:44
поделиться
@{ $HoA{flintstones} } = grep { $$_{day} != 21 } @{ $HoA{flintstones} };

Это имеет то преимущество перед просто присвоением свежего arrayref к $HoA{flintstones}, что существующие ссылки на $HoA{flintstones} (если таковые имеются) будут продолжать ссылаться на массив в %HoA.

Или, более читабельно:

my $flintstones = $HoA{flintstones};
@$flintstones = grep { $$_{day} != 21 } @$flintstones;
4
ответ дан 18 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: