如何使用grep
或map
删除数组中的元素或引用数组?我在使用splice
从数组引用中删除一个或多个元素时遇到问题,并希望grep
或map
能够为我提供更好的解决方案。
@removedElements = grep /test/, @array;
答案 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.