假设我打开一个这样的文件:
#!/usr/bin/perl
open FILE, "8882099";
while ($line = <FILE>) {
if ($line =~ /accepted by(.*?)\./s) {
print "accepted by: $1";
}
}
问题是正则表达式正在工作,但是由于文件是逐行读取的,我应该如何匹配这个继续到新行的字符串?
谢谢
一次读取整个文件通常是最简单的。
my $file;
{
local $/;
$file = <$fh>;
}
首先,您必须始终 处于每个程序的顶部use strict
。use 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