删除没有索引

时间:2016-02-17 16:50:39

标签: arrays perl grep

我有一个包含几个字符串的数组。还有另一个数组包含可能包含或不包含在第一个数组中的字符串。

从数组a中的字符串中删除数组b中字符串的任何实例的最佳方法是什么?我试图使用grep,如下例所示,但它完全清空了数组。

my @Aray = ('Chris', 'John', 'Paul', 'Max', 'Jim', 'John');
my @Bray = ('Chris', 'John');
foreach $name (@Bray){
    @Aray = grep {$_ != $name} @Aray;
}

这会导致@Aray中没有任何元素,反对'保罗','马克斯','吉姆'

我还尝试使用传统的for循环并使用相同的结果索引@Bray中的每个名称。

1 个答案:

答案 0 :(得分:6)

@choroba上面显示了如何解决您要问的具体问题。

基于另一个数组中的元素删除一个数组的元素是Perl中的常见问题,并且有一个有用的习惯用语可以加速这些操作。具体做法是:

  1. 将要删除的元素(数组B)放在Hash H.中。
  2. 循环遍历数组A并测试其中的任何元素是否在Hash H中,如果是,则删除它们,否则保留它们
  3. 此方法的好处是只能读取一次删除数组(数组B)而不是数组A的每个元素

    my @Aray = ('Chris', 'John', 'Paul', 'Max', 'Jim', 'John');
    my @Bray = ('Chris', 'John');
    
    my %to_delete = map { $_ => 1 } @Bray;
    @Aray = grep { ! $to_delete{$_} } @Aray;