Hashes of Array в Perl: обход и удаление - PullRequest
5 голосов
/ 03 марта 2010

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

%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'} ]
);

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

Ответы [ 5 ]

10 голосов
/ 03 марта 2010

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

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

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

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

Или так, как подсказывает ответ Шона:

@{$HoA{flintstones}} = grep { $_->{day} != 21 } @{$HoA{flintstones}};
4 голосов
/ 03 марта 2010
@{ $HoA{flintstones} } = grep { $$_{day} != 21 } @{ $HoA{flintstones} };

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

Или, более наглядно:

my $flintstones = $HoA{flintstones};
@$flintstones = grep { $$_{day} != 21 } @$flintstones;
2 голосов
/ 03 марта 2010

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

0 голосов
/ 03 марта 2010

удалить $ {$ {$ HoA {flintstones}} [1]} {день};

0 голосов
/ 03 марта 2010

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

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

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