4

假设我打开一个这样的文件:

#!/usr/bin/perl

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

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

谢谢

4

2 回答 2

4

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

my $file;
{
   local $/;
   $file = <$fh>;
}
于 2012-11-23T19:04:32.593 回答
3

首先,您必须始终 处于每个程序的顶部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
于 2012-11-23T21:41:28.513 回答