Perl多行匹配,同时从文件中逐行读取

时间:2012-11-23 18:25:30

标签: regex perl lines

让我说我打开一个这样的文件:

#!/usr/bin/perl

open FILE, "8882099";
while ($line = <FILE>) {
  if ($line =~ /accepted by(.*?)\./s) {
    print "accepted by: $1";
  }
}

问题是正则表达式是否正常工作,但由于文件是逐行读取的,我应该如何匹配这个继续到新行的字符串?

谢谢

2 个答案:

答案 0 :(得分:4)

一次读取整个文件通常最简单。

my $file;
{
   local $/;
   $file = <$fh>;
}

答案 1 :(得分:2)

首先,您必须始终 use strictuse warnings位于每个程序的顶部。这样就会向你指出你原本会忽略的简单错误。

其次,您应该使用词法文件名,open三参数格式,并始终检查每个open来电的状态。

要解决您的问题,您应该只查找包含前缀accepted by的行,然后将行添加到您找到的字符串,直到您看到完整的字符串匹配为止。使用明确的[^.]+比使用非贪婪的.*?更好,以避免回溯。

请注意,您应该恢复我已注释掉的文件,并删除$file的作业,因为我已经将此程序编写为测试目的。

如果将accepted by拆分为多行,则此解决方案会出现问题。如果您期望这样,那么必须编写一些略有不同的内容。

use strict;
use warnings;

# open my $file, '<', '8882099' or die $!;
my $file = \*DATA;

my $line;
while ($line = <$file>) {

  if ($line =~ /accepted by/) {
    $line .= <$file> until $line =~ /accepted by\s*([^.]*)\./;
    print "accepted by: $1\n";
  }

}

__DATA__

    accepted by Tim.


    accepted by The
Financial
Director.
Today

<强>输出

accepted by: Tim
accepted by: The
Financial
Director