как может я удалять элемент из следующего хеша массивов;
%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,
вместо элемента, который я удаляю
Если вы знаете, что хотите удалить элемент [1]
из массива кремневых камней, вы можете напрямую использовать splice
:
splice @{$HoA{flintstones}}, 1, 1;
Если вы просто знаете, что хотите удалить элементы, у которых день = 21, используйте grep
либо таким образом:
$HoA{flintstones} = [ grep { $_->{day} != 21 } @{$HoA{flintstones}} ];
Или лучше, как предлагает ответ Шона:
@{$HoA{flintstones}} = grep { $_->{day} != 21 } @{$HoA{flintstones}};
Используйте функцию delete для удаления определенного элемента из хэша.
delete $HoA{flintstones}->[1];
Итерация по ключам %HoA
, применение grep
к каждому из массивов (вам придется снять с них ссылки с помощью @{$HoA{$key}}
), сохранение ссылок на результаты обратно в $HoA{$key}
.
@{ $HoA{flintstones} } = grep { $$_{day} != 21 } @{ $HoA{flintstones} };
Это имеет то преимущество перед просто присвоением свежего arrayref к $HoA{flintstones}
, что существующие ссылки на $HoA{flintstones}
(если таковые имеются) будут продолжать ссылаться на массив в %HoA
.
Или, более читабельно:
my $flintstones = $HoA{flintstones};
@$flintstones = grep { $$_{day} != 21 } @$flintstones;