打印正则表达式匹配 Perl



您好,我正在制作一个将一组给定的关键字与文件匹配的程序。

我想将匹配的数据输出到文本文件,并包含触发匹配的正则表达式关键字。

以下是与我的问题相关的代码:

my $counter = 0;
foreach($words) 
{
    while($line = <FILE>)
    {
        if($line =~ /$words/)
        {
            print "@array[$counter] $linen";
            print OUTPUT $line;
        }
    }
    $counter ++;
}

这不会产生预期的结果。它非常适合数组中的第一个元素,但对于其余元素,它只是简单地再次打印第一个元素。我相信计数器没有增加。

有没有更好/更简单的方法来获取循环中使用的当前元素? 甚至获取当前的正则表达式匹配?

问题是<FILE>耗尽第一个单词的文件。对于下一个单词,<FILE>尝试在文件末尾读取,这意味着跳过整个循环。

您可以遍历文件循环中的单词,也可以查找返回到循环末尾的文件开头。

这是你应该做的:

use strict;
use warnings;
use 5.016;
my $fname = 'data.txt';
my @patterns = (
    'do.',
    '.at',
    '.ir.',
);
open my $INFILE, '<', $fname
    or die "Couldn't read from $fname: $!";
while (my $line = <$INFILE>) {
    for my $pattern (@patterns) {
        if ($line =~ /($pattern)/) {
            print "$pattern --> $1";
        }
    }
}
close $INFILE:
  1. 在正则表达式的某些部分周围加上括号会导致 perl 设置匹配变量 $1、$2、$3 等,其中包含每个括号组的匹配项。

  2. $line行尾将有一个换行符,因此如果您编写print "$linen",您将添加另一个换行符,因此输出文件在您打印的每一行之间都会有空行。

最新更新