【问题标题】:Why this OR operator not working in perl为什么这个 OR 运算符不能在 perl 中工作
【发布时间】:2017-04-14 00:29:32
【问题描述】:

我正在尝试在 perl 中使用二进制 OR 运算符从文件中获取一些信息。我用了这个正则表达式

 /(fix|issue)\s*#/mi

但它没有找到任何匹配项。 在文件中有 4 个匹配 'fix #' 和 3 个匹配 'issue #',我在没有 OR 运算符的情况下单独使用它们时是正确的。

   /fix\s*#/mi

   /issue\s*#/mi

所以 OR 假设返回 7 个匹配项,但它什么也不返回。

这两行正好在文件中

Add test for the example in issue #142.

 Fix #1190

我这样做对吗?

感谢您的帮助

【问题讨论】:

  • 这不是二进制 OR,而是正则表达式中的 OR。没有看到您的真实输入,我们不知道您的模式是否有效。如果没有/g,除非匹配为零,否则您将永远不会得到超过一个匹配。
  • 输入是1000多行的大文件。该文件正好有“问题#”和“修复#”。
  • 文件的大小对我们来说并不重要。您可以包含您认为应该匹配的一行,以及不应该匹配的一行。更好的是,edit 您的问题并包含您编写的完整程序。正如下面的 choroba 指出的那样,这应该有效。所以bug很可能在我们看不到的代码中。
  • 我从文件中复制粘贴两行。谢谢你。
  • 没有区别,但它有助于提供上下文。现在请出示您的代码。

标签: perl


【解决方案1】:

它对我有用。由于未给出/g,因此每行匹配一次。此外,/m 没有用处,因为既没有使用 ^ 也没有使用 $/i 也使 ISSUE # 匹配。

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

while (<DATA>) {
    say "Matched $1" if /(fix|issue)\s*#/mi;
}

__DATA__
fix #
fix # fix #
---
issue #
issue # issue #

请注意,“二元或”是在正则表达式之外使用的不同运算符:

say 4 | 8;  # 12

| 在正则表达式中被称为“交替”。

【讨论】:

  • 对不起,我把它们混为一谈,我的意思是正则表达式中的 OR。谢谢你的帮助。
  • @Hukh:您已经接受了一个基本上说您的原始代码应该可以工作的答案。如果您要解释为什么您的代码不起作用,它可能对将来遇到类似问题的任何人有所帮助。
猜你喜欢
  • 2023-04-06
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多