Perl:if(列表中的元素)

2024-03-15

我正在寻找列表中是否存在某个元素。

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

if element in list:
    doTask

Perl 中是否有等效的东西,而无需手动迭代整个列表?


UPDATE:

smartmatch 系列功能现已处于实验阶段 https://metacpan.org/pod/release/RJBS/perl-5.18.0/pod/perldelta.pod#The-smartmatch-family-of-features-are-now-experimental

智能匹配在 v5.10.0 中添加,并在 v5.10.1 中进行了重大修改,一直是人们经常抱怨的地方。尽管它在很多方面都很有用,但它也被证明给 Perl 的用户和实现者带来了问题和困惑。关于如何最好地解决该问题已经提出了许多建议。很明显,智能匹配几乎肯定会在未来发生变化或消失。不建议依赖其当前行为。

现在,当解析器看到 ~~、given 或 when 时,将发出警告。




如果您不需要 Perl v5.10,那么您可以使用以下任何示例。

  • The 智能匹配~~ http://perldoc.perl.org/perlsyn.html#Smart-matching-in-detail操作员。

    if( $element ~~ @list ){ ... }
    if( $element ~~ [ 1, 2, 3 ] ){ ... }
    
  • 您还可以使用given/when http://perldoc.perl.org/perlsyn.html#Switch-statements构造。它在内部使用智能匹配功能。

    given( $element ){
       when( @list ){ ... }
    }
    
  • 您还可以使用for循环作为“主题化器”(意味着它设置$_ ).

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

Perl 5.12 中将出现的一件事是能够使用后修复版本when。这使得它更像if and unless.

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

如果您必须能够在旧版本的 Perl 上运行,仍然有多种选择。

  • 您可能认为您可以使用列表::实用程序::第一个 http://perldoc.perl.org/List/Util.html#first-BLOCK-LIST,但是有一些边缘条件会导致出现问题。

    在这个例子中,很明显我们想要成功匹配0。不幸的是这段代码会打印failure每次。

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

    你可以检查一下返回值first http://perldoc.perl.org/List/Util.html#first-BLOCK-LIST为了定义性,但如果我们真的想要匹配,那将会失败undef成功。

  • 您可以放心使用grep http://perldoc.perl.org/functions/grep.html然而。

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

    这是安全的,因为grep在标量上下文中被调用。在标量上下文中调用时,数组返回元素的数量。所以即使我们尝试匹配,这也会继续起作用undef.

  • 您可以使用封闭的for环形。只要确保你打电话last,在成功匹配时退出循环。否则,您可能会多次运行代码。

    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很大and,你将要匹配%hash几次。特别是如果@array不会改变,因为那样你只需要加载%hash once.

    my %hash = map { $_, 1 } @array;
    if( $hash{ $element } ){ ... }
    
  • 您也可以制作自己的子程序。这是有用的情况之一原型 http://perldoc.perl.org/perlsub.html#Prototypes.

    sub in(&@){
      local $_;
      my $code = shift;
      for( @_ ){ # sets $_
        if( $code->() ){
          return 1;
        }
      }
      return 0;
    }
    
    if( in { $element eq $_ } @list ){ ... }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl:if(列表中的元素) 的相关文章

随机推荐

  • 如果可以使用 JZMQ,为什么还需要 JeroMQ?

    简单的问题 为什么在 Java 上 移植 zmq 并将其称为 JeroMQ 是个好主意 JeroMQ是ZeroMQ社区的官方项目 它是 C libzmq 库的完整移植 支持 3 2 版本 优点 纯Java 因此无需通过JNI链接C C 这对
  • 使用 Bitbucket 团队存储库配置 Android Studio

    我正在尝试配置 Android Studio 以与 Bitbucket 上的团队存储库配合使用 我首先想做的是将我的本地项目推送到我团队的存储库中 我已经安装了 Bitbucket 插件 但不知道从哪里开始 当我尝试提交更改时 我得到的只是
  • cytoscape:改变第二轴出租车分支的长度

    I want to create a tree with different branch lengths looking like this Is there a possibility of assigning a length to
  • 省略 yui 数据表中的文本

    嘿 我正在寻找一种在 yui 数据表中省略文本的好方法 我的意思是 格式化文本 使其能够很好地适合其单元格 并且如果文本必须被截断 则在其后面有一个椭圆 我想在不使用 CSS 选择器的情况下执行此操作 因为我有一个很大的数据集 并且按类名选
  • Worker 启动失败 CSINodeIfo:更新 CSINode 注释时出错

    2个月前我创建了一个kubernetes集群1个master和2个worker节点 今天一个工作节点开始出现故障 我不知道为什么 我认为我的工人没有发生任何异常情况 我使用 flannel 和 kubeadm 创建集群 并且运行良好 如果我
  • 关于 Integer.parseInt() 和强制转换的 Java 初学者问题

    所以当像下面的声明一样进行铸造时 int randomNumber int Math random 5 它会导致随机数 生成以转换为 int 还有一个我刚刚遇到的 Integer parseInt 方法 它的作用相同 即返回一个整数 为什么
  • 数据中的是什么?

    我使用OCaml版本4 02 3 我定义了一个类型self type self Self of self type self Self of self 及其实例s let rec s Self s val s self Self
  • 如何在 github actions 工作流程 ci 中通过 npm 安装私有 github 存储库

    我正在尝试通过运行在 github 工作流程 ci 中安装 npm 依赖项npm install 但是我收到以下错误 npm ERR Error while executing npm ERR usr bin git ls remote h
  • 计算列中的位数

    这是我的代码 select len cast code as float code from tbl1 where code is not null 这是输出 我想要代码栏中的位数 我不明白为什么最后一个算12而不是8 将其投射为int反而
  • 烦人的 python tesseract 错误打开数据文件时出错 ./tessdata/eng.traineddata

    我遇到了这个错误 这让我对 tesseract 的 python 包装器有点疯狂 这是一个名为 tesseract 的 python 模块 这是我尝试运行的 python 代码 img cv2 imread image 0 api tess
  • Android 12 闪屏 API 定制

    自从 Android 在 Android 12 中发布了新的 Splash Screen API 以来 许多应用程序都存在重复的启动屏幕 缺乏自定义等问题 现在 可以设置背景颜色和中间的图标 但是可以自定义更多吗 由于现在我们只能使用单色背
  • 在为 iPhone 开发时,您遇到的最讨厌的错误是什么? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 任何语言都有其著名且令人痛苦的错误
  • QPSQL 驱动程序未加载 Qt

    当我想添加数据库时遇到一些麻烦 dataBase QSqlDatabase addDatabase QPSQL 调用此方法后出现错误 QSqlDatabase QPSQL driver not loaded QSqlDatabase ava
  • 使用 Jackson 进行不可变/多态 POJO <-> JSON 序列化

    我正在尝试使用 Jackson 2 1 4 将不可变的 POJO 与 JSON 进行序列化 而无需编写自定义序列化程序并使用尽可能少的注释 我还希望避免仅仅为了满足 Jackson 库而添加不必要的 getter 或默认构造函数 我现在陷入
  • 我可以说构造函数是方法吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想知道我是否可以说构造函数是一个特殊情况method 你可以说什么 是否有人会不同意你的观点取决于具体情况 一些语言社区和标准以这种方式定义事
  • 如何在 Markdown 文件中输入 html 而不渲染?

    我想在 markdown 文件中输入以下句子 她说 h1 很大 我可以在 StackOverflow 中使用 h1 周围的三个反引号来完成此操作 但这不适用于 md 文件 我还尝试过单反引号 单引号 双引号 主题标签 间距 code h1
  • 这些“\e6##”字符是什么意思?

    https www keysurgical com assets scss objectsCustom icons scss https www keysurgical com assets scss objectsCustom icons
  • 在 Rcpp 中使用 arma::cube 制作 3d 数组显示立方体错误

    我正在为吉布斯采样制作 Rcpp 代码 在代码中 我首先想要创建一个 3 维数组 其中行数 迭代次数 500 列数 参数数 4 切片数 链数 3 我是这样写的 include
  • 通过实体框架创建记录时未插入数据库默认值

    我在 sql server 2008 中有一个登录记录表 其列结构如下 LoginId int identity UserId int LoginDateTime Allow nulls false default value getdat
  • Perl:if(列表中的元素)

    我正在寻找列表中是否存在某个元素 在Python中有一个in关键字 我会做类似的事情 if element in list doTask Perl 中是否有等效的东西 而无需手动迭代整个列表 UPDATE smartmatch 系列功能现已