2010-03-03 27 views
5

cómo puedo eliminar un elemento del siguiente hash de matrices;Hashes of Array en Perl: recorrido y borrado

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

Al igual que cómo puedo eliminar por ejemplo {day=>'21'} de flintstones y hacer que el resultado parezca;

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

He intentado usar Hash =(); pero que se traduce en undef, en lugar del elemento que i eliminar

Respuesta

2

iterar sobre keys %HoA, aplico grep en cada una de las matrices (que tendrá que Deshacer referencia con @{$HoA{$key}}), almacenar referencias a los resultados de vuelta en $HoA{$key}.

0

Utilice la función eliminar para eliminar un elemento específico del hash.

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

+0

da "NO una referencia de matriz" – bilal

10

Si sabe que desea eliminar el elemento [1] de la matriz flintstones, puede utilizar splice directamente:

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

Si simplemente sabe que desea eliminar elementos que tienen días = 21, utilice grep ya sea de esta manera:

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

O en este mejor manera, como lo sugiere la respuesta de Sean:

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

Esto tiene la ventaja sobre la asignación a un arrayref fresco a $HoA{flintstones} que las referencias existentes a $HoA{flintstones} (si lo hay) serán todos seguirá haciendo referencia a la matriz en %HoA.

O, más legible:

my $flintstones = $HoA{flintstones}; 
@$flintstones = grep { $$_{day} != 21 } @$flintstones; 
0

eliminar $ {$ {$ {HoA flintstones}} [1]} {} días;