如何使用grep或map删除元素?

时间:2012-05-29 00:36:57

标签: perl

如何使用grepmap删除数组中的元素或引用数组?我在使用splice从数组引用中删除一个或多个元素时遇到问题,并希望grepmap能够为我提供更好的解决方案。

@removedElements = grep /test/, @array;

3 个答案:

答案 0 :(得分:9)

你说"array or reference array"就像是两件不同的事情。这令人困惑。

我认为既然您已将数组命名为@removedElements,那么您要问的是如何从@array 删除元素并将它们放入{{1} }}

@removedElements

对测试的简单否定将产生任一列表。你也可以做一个循环:

@removedElements = grep /test/, @array;   
@array           = grep ! /test/, @array;

这样可以减少执行的检查。

为了使用my (@removedElements, @rest); for (@array) { if (/test/) { push @removedElements, $_; } else { push @rest, $_; } } ,你需要跟踪索引,在这种情况下我不确定它是否值得。它肯定不会让你的代码更容易阅读。同样,我怀疑splice比常规循环更有用。

答案 1 :(得分:8)

如果您知道要保留的元素,请使用grep

my @keepers = grep /interesting/, @array;

如果你有一个数组的引用,那么写

my @keepers = grep /interesting/, @$arrayref;

请注意,这不会修改数组。

该过程与map类似。给定拒绝元素的测试,写

my @keepers = map /do not want/ ? () : $_, @array;

反转测试感
my @keepers = map /interesting/ ? $_ : (), @array;

答案 2 :(得分:2)

您可能还需要List::UtilsBy中的extract_by功能。它类似于grep,除了它从传递的数组中删除项目。

use List::UtilsBy qw( extract_by );

# some values in @array

my @removed = extract_by { m/test/ } @array;

# Matching elements will now be removed from @array and appear in @removed.