代码之家  ›  专栏  ›  技术社区  ›  A.G.Progm.Enthusiast

如何使用Perl中的拼接从数组中一次性删除随机元素?

  •  2
  • A.G.Progm.Enthusiast  · 技术社区  · 6 月前

    我有一个Perl数组,如下所示:

    my@arr=qw(ram sam ham dam yam fam lam cam)

    我想使用拼接从上面的数组中删除sam、yam和lam。 我使用以下代码来完成此操作:

    # first getting the index of sam 
    (my  $ind ) = grep {$arr[$_] eq 'sam'} 0 .. $#arr;
    splice(@arr, $ind, 1); 
    

    我的问题是,由于数组元素的位置发生了变化,我需要再次获取yam和lam的索引,并对数组进行拼接。

    有没有其他方法可以让我一次性使用拼接从数组中删除随机元素。我可以一次获得所有它们的索引,并将它们从数组中删除,但这些位置将保持我不想要的undef值。

    谢谢

    1 回复  |  直到 6 月前
        1
  •  2
  •   zdim    6 月前

    如果您知道要删除的元素的值( sam 等等),而不是索引,可以做到

    my $re = join '|', map { q(\b).$_.q(\b) } qw(sam yam lam);
    
    my @filtered_ary = grep { not /$re/ } @ary;
    

    或者覆盖数组

    @ary = grep { ... } @ary
    

    无需先查找索引即可使用 splice .


    或者,如 jhnc 议论

    my %remove = map { $_ => 1 } qw(sam yam lam); 
    
    @ary = grep { not $remove{$_} } @ary;
    

    这比上面的解决方案更快,因为它只执行查找而不是regex,而它们的开销相当相似。