【问题标题】:Perl: Searching for item in an ArrayPerl:在数组中搜索项目
【发布时间】:2012-05-01 16:45:44
【问题描述】:

给定一个array @A,我们想检查element $B 是否在其中。一种方式是这样说:

Foreach $element (@A){
    if($element eq $B){
        print "$B is in array A";
    }
}

然而,当谈到 Perl 时,我总是在考虑最优雅的方式。这就是我的想法: 如果我们将 A 转换为变量字符串并使用

,有没有办法找出数组 A 是否包含 B
index(@A,$B)=>0

这可能吗?

【问题讨论】:

标签: arrays perl variables hash perl-data-structures


【解决方案1】:

有很多方法可以找出元素是否存在于数组中:

  1. 使用 foreach

    foreach my $element (@a) {
        if($element eq $b) {
           # do something             
           last;
        }
    }
    
  2. 使用 Grep:

    my $found = grep { $_ eq $b } @a;
    
  3. 使用List::Util模块

    use List::Util qw(first); 
    
    my $found = first { $_ eq $b } @a;
    
  4. 使用由切片初始化的哈希

    my %check;
    @check{@a} = ();
    
    my $found = exists $check{$b};
    
  5. 使用map初始化的Hash

    my %check = map { $_ => 1 } @a;
    
    my $found = $check{$b};
    

【讨论】:

  • List::Util::first() 示例在搜索假值时(可能)有些不正确,因为$found 也会评估为假。 (die unless $found ... 哎呀!)List::MoreUtils::any 在这里做正确的事。
【解决方案2】:
use 5.10.1;

$B ~~ @A and say '$B in @A';

【讨论】:

  • 您必须非常小心,因为这会将匹配分布在元素上。如果@A 有一个包含$B 的数组引用元素,即使$B 不是@A 的顶级元素,它仍然会匹配。由于这个和许多其他原因,智能匹配从根本上被破坏了。
【解决方案3】:
use List::AllUtils qw/ any /;
print "\@A contains $B" if any { $B eq $_ } @A;

【讨论】:

  • 在这种情况下我会推荐first,因为它不必遍历整个数组。它可以在找到项目时停止。
  • any 也可以停止,因为它只需要一个元素为真。
  • 请注意,first 如果找到例如“0”,也可能返回错误值,这会混淆此答案中给出的示例。 any 具有所需的语义。
猜你喜欢
  • 2020-10-10
  • 2013-12-20
  • 2018-09-10
  • 2022-12-18
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
相关资源
最近更新 更多