在perl中,检查数组中的值,如果存在另一个数组的每个值,则将其删除

时间:2010-08-10 19:31:05

标签: arrays perl

基本上,我有一个数组,让我们说@badvalues

我有另一个数组,让我们说@values

基本上,我想要这个:

对于@badvalues

中的每个元素
  • 查看它是否在@values
  • 如果是,请将其删除
  • 最终,我应该最终得到数组@values,不包含数组@badvalues中的元素,或者新数组@goodvalues,包含{{1}的每个元素1}}这不是@values
  • 的元素

我知道这听起来很简单,也许是因为我累了,但在搜索时似乎无法找到这个问题的明确答案。

3 个答案:

答案 0 :(得分:10)

# Get only bad values
my %values = map {$_=>1} @values;
my @new_badvalues = grep { !$values{$_} } @badvalues;

# Get only good values
my %badvalues = map {$_=>1} @badvalues;
my @goodvalues = grep { !$badvalues{$_} } @values;

# An alternative
@badvalues{@badvalues} = ();
foreach $item (@values) {
    push(@goodvalues, $item) unless exists $badvalues{$item};
}

如需更完整的参考,请参阅“Perl Cookbook”中的“第4.7章。在一个数组中查找元素而不是另一个数组”

答案 1 :(得分:1)

如果你有一个现代的Perl版本,比如说> = 5.10.1,那么你也可以这样做:

my @final_good = grep { !($_ ~~ @badvalues ) } @values;

或更清晰的优先权:

my @final_good = grep { not $_ ~~ @badvalues } @values;

这是使用Perl 5.10中添加的smartmatch运算符。

答案 2 :(得分:1)

DVK's answer

中显示的方法更快,占用内存更少
my %badvalues;
@badvalues{@badvalues} = ();
my @goodvalues = grep !exists $badvalues{$_}, @values;