2010-03-03 54 views
5

如何從下面的數組哈希中刪除一個元素;Perl中數組的哈希值:遍歷和刪除

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

就像我如何從flintstones刪除e.g {day=>'21'},使結果看起來像;

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

我試過使用Hash =();但導致undef,的地方,我在每個陣列刪除

回答

2

遍歷keys %HoA,適用grep元素(你將與@{$HoA{$key}}到unreference它們),存儲引用到的結果早在$HoA{$key}

0

使用刪除功能從散列中刪除特定元素。

刪除$ HoA {flintstones} - > [1];

+0

它給出「不是數組引用」 – bilal

10

如果你知道你要刪除從打火石陣列[1]元素,你可以直接使用splice

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

如果你只是知道要刪除其天= 21元,使用grep無論是在這樣:

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

或在這種更好的方式,由肖恩的答案建議:

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

這樣做的優勢只是分配一個新的數組引用到$HoA{flintstones}現有引用$HoA{flintstones}(如果有的話)都將繼續引用數組中%HoA

或者其可讀性:

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

刪除$ {$ {$ {家鄉地址打火石}} [1]} {}天;