数组有很多数据,我需要删除两个元素。
下面是我使用的代码片段,
my @array = (1,2,3,4,5,6,9); my $element_omitted = 5; @array = grep { $_ != $element_omitted } @array;
解决方法
如果您已经知道要删除的元素的索引,请使用splice。
Grep工作,如果你正在搜索。
如果你需要做很多这些,你将获得更好的性能,如果你保持数组的排序顺序,因为你可以进行二进制搜索找到必要的索引。
如果在上下文中有意义,可以考虑对已删除的记录使用“魔术值”,而不是删除它们,以保存数据移动 – 例如,将删除的元素设置为undef。自然,这有自己的问题(如果你需要知道“活”元素的数量,你需要分开跟踪它,等),但可能值得麻烦,取决于你的应用程序。
编辑实际上,现在我再看一下 – 不要使用上面的grep代码。它将更有效地找到您要删除的元素的索引,然后使用splice来删除它(你累积了所有不匹配的结果的代码..)
my $index = 0; $index++ until $arr[$index] eq 'foo'; splice(@arr,$index,1);
这将删除第一次出现。
删除所有的出现是非常相似的,除了你想要一次通过所有的索引:
my @del_indexes = grep { $arr[$_] eq 'foo' } 0..$#arr;
其余的作为一个练习留给读者 – 记住数组在你拼接时改变!
编辑2 John Siracusa正确地指出我在我的例子中有一个错误..修复,对不起。