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

5
如何从以下数组哈希中删除元素:
%HoA = (
    flintstones    => [ {day=>'19'}, {day=>'21'}, {day=>'22'} ],
    jetsons        => [ {day=>'29'}, {day=>'23'}, {day=>'25'} ],
    simpsons       => [ {day=>'26'}, {day=>'33'}, {day=>'27'} ]
);

如何从flintstones中删除例如{day=>'21'},并使结果看起来像:

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

我尝试使用 Hash = (); 但是删除元素后会导致 undef
5个回答

10

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

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

如果你只是想要移除那些日期为21号的元素,可以使用grep,方法如下:

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

或者按照Sean的回答所建议的更好的方法:

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

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

这种方法比仅仅将新的数组引用赋值给$HoA{flintstones}要好,因为现有对$HoA{flintstones}的引用(如果有)都将继续引用%HoA中的数组。

或者更易读:

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

2

遍历 %HoA 的键,对每个数组应用 grep(您需要使用 @{$HoA{$key}} 解除引用),将结果的引用存储回 $HoA{$key}


0
使用 delete 函数从哈希表中删除特定元素。
删除 $HoA{flintstones}->[1];

它给出的是“不是数组引用”。 - bilal

0

删除 ${${$HoA{flintstones}}[1]}{day};



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接