加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl:if(列表中的元素)

发布时间:2020-12-15 21:28:31 所属栏目:大数据 来源:网络整理
导读:我正在寻找一个元素在列表中的存在。 在Python中有一个关键字,我会做类似: if element in list: doTask 在Perl中有没有等同的东西,而不必手动遍历整个列表? 解决方法 如果你可以离开需要Perl v5.10,那么你可以使用下面的任何例子。 smart match ~~ 运算
我正在寻找一个元素在列表中的存在。

在Python中有一个关键字,我会做类似:

if element in list:
    doTask

在Perl中有没有等同的东西,而不必手动遍历整个列表?

解决方法

如果你可以离开需要Perl v5.10,那么你可以使用下面的任何例子。

> smart match ~~运算符。

if( $element ~~ @list ){ ... }
if( $element ~~ [ 1,2,3 ] ){ ... }

>您也可以使用given/when构造。它在内部使用智能匹配功能。

given( $element ){
   when( @list ){ ... }
}

>你也可以使用for循环作为“局部化”(意思是它设置$ _)。

for( @elements ){
   when( @list ){ ... }
}

在Perl 5.12中会出现的一个事情是能够使用post的fix版本。这使得它更像是如果和除非。

given( $element ){
  ... when @list;
}

如果你必须能够在旧版本的Perl上运行,还有几个选项。

>你可能认为你可以放弃使用List::Util::first,但有一些边缘条件,使它有问题。

在这个例子中,很明显我们想成功匹配0.遗憾的是,这段代码每次都会打印失败。

use List::Util qw'first';
my $element = 0;
if( first { $element eq $_ } 0..9 ){
  print "successn";
} else {
  print "failuren";
}

你可以检查定义的first的返回值,但是如果我们实际上想要一个匹配undef成功的话,这将失败。
>但你可以安全地使用grep

if( grep { $element eq $_ } 0..9 ){ ... }

这是安全的,因为grep在标量上下文中被调用。数组在标量上下文中调用时返回元素的数量。所以这将继续工作,即使我们试图匹配undef。
>你可以使用一个封闭的for循环。只要确保你最后调用,退出循环成功的比赛。否则,您可能会多次运行代码。

for( @array ){
  if( $element eq $_ ){
    ...
    last;
  }
}

>你可以把for循环放在if语句的条件中…

if(
  do{
    my $match = 0;
    for( @list ){
      if( $element eq $_ ){
        $match = 1;
        last;
      }
    }
    $match; # the return value of the do block
  }
){
  ...
}

> …但是可能更清楚的是将for循环放在if语句之前。

my $match = 0;
for( @list ){
  if( $_ eq $element ){
    $match = 1;
    last;
  }
}

if( $match ){ ... }

>如果你只匹配字符串,你也可以使用哈希。这可以加快你的程序,如果@list很大,并且你要匹配%hash几次。特别是如果@array不改变,因为那时你只需要加载%哈希一次。

my %hash = map { $_,1 } @array;
if( $hash{ $element } ){ ... }

>你也可以做自己的子程序。这是使用prototypes有用的情况之一。

sub in(&@){
  local $_;
  my $code = shift;
  for( @_ ){ # sets $_
    if( $code->() ){
      return 1;
    }
  }
  return 0;
}

if( in { $element eq $_ } @list ){ ... }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读