Perl文件读取与RegEx匹配

Perl File Reading and RegEx Matching

我正在做一个小的 perl 脚本,但我在读取文件时遇到了一些问题,而不是迭代正则表达式。

特别是文件超过多行,对于每一行,我需要提取一些值,我 post 一个例子可以更好地理解。

这是文件的示例行

            1A    OCC OCC  4B  5B  6B  7B  8B    9A
      OCC OCC    12B 13B 14B OCC 16B 17B 18B   OCC OCC

我需要分别匹配第一、第二、n..行: 1A 4B 5B 6B 7B ...

OCC 除外。

我写了这段代码:

my $path="file.txt";

open (my $fh, "<", $path);

 while(my $line = <$fh>)
 {
    for ($line =~/(\d{1,2}[A|B|C])/){   
      print " ";  
 }
}

我得到的结果只匹配在线上第一次出现的匹配项。 1A 12B

如何扩展以读取所有行并正确匹配内容?

打印结果仅供我调试测试用

要匹配所有出现的正则表达式,您需要使用 /g 修饰符。

此外,由于 for 的参数是在列表上下文中计算的,它会立即 return 所有匹配项,因此使用 </code> 会 return 相同每场比赛的价值(最后一个);但您可以改用循环变量:</p> <pre><code>for ($line =~ /(\d{1,2}[ABC])/g) { print " $_"; }

但是,通常使用 while 循环匹配,因为它 return 一个接一个匹配的部分,而不需要有很长的匹配列表。在这里,您需要 </code>,因为循环条件是在标量上下文中计算的:</p> <pre><code>while ($line =~ /(\d{1,2}[ABC])/g) { print " "; }

注意:您的输入不包含 |,因此我将其从字符 class 中删除。

您编写的匹配项捕获了 一次 并停止了。所以 for 循环遍历 (line =~ ...) 中的那个数字。

您可以改为使用 /g 修饰符 ,这将使正则表达式继续运行并找到所有匹配项。如果将其分配给数组,则运算符位于 列表上下文 中并且它 returns 全部匹配

my @matches = $line =~ /\d{1,2}[A-C]/g;

这里不需要捕获括号,因为你进行了整场比赛。如有疑问,请添加它们。如果您只需要任何数字后跟任何字母,您可以使用 /\d+\w+/g 代替。

我想再提几点意见。

  • 始终使用use warnings;use strict;

  • 启动您的程序
  • 总是,总是检查像open

  • 这样的调用

一共

use warnings 'all';
use strict;
use feature qw(say);

my $path="file.txt";

open my $fh, "<", $path  or die "Can't open $path: $!";

while (my $line = <$fh>)
{
    my @matches = $line =~ /(\d{1,2}[A-C])/g;

    say "@matches";
}

close $fh;