Perl中的数组哈希:遍历和删除

bil*_*lal 5 perl hash

如何从以下数组散列中删除元素;

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

像如何删除如{day=>'21'}flintstones,使结果看起来像;

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

我尝试过使用Hash =(); 但这导致undef,我删除的元素的位置

FMc*_*FMc 10

如果您知道[1]要从flintstones数组中删除该元素,可以splice直接使用:

splice @{$HoA{flintstones}}, 1, 1;
Run Code Online (Sandbox Code Playgroud)

如果您只是想知道要删除day = 21的元素,请grep以这种方式使用:

$HoA{flintstones} = [ grep { $_->{day} != 21 } @{$HoA{flintstones}} ];
Run Code Online (Sandbox Code Playgroud)

或者以更好的方式,正如肖恩的回答所示:

@{$HoA{flintstones}} = grep { $_->{day} != 21 } @{$HoA{flintstones}};
Run Code Online (Sandbox Code Playgroud)


Luk*_*ský 2

迭代keys %HoA,应用于grep每个数组(您必须使用 取消引用它们@{$HoA{$key}}),将对结果的引用存储回 中$HoA{$key}