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