我有一个文本文件格式如下:
44.820731 122啊
44.947098 122 m
我需要在另一个特定的最后一个变量之前找到某个最后一个变量。例如,我想找到一组2行,其中一行的最后一部分为" ng"并且下一行的最后一部分是" b",如下例所示。我只需要将行放入变量并打印出这个模式所在的位置。
50.820731 122 ng
51.947098 122 b
我最初的想法是写一个正则表达式然后分配匹配变量,如下面的代码所示:
$line = m/\s+(\d\.\d+)\s(\d+)\s(.+\Z)/;
my ($time, $number, $phone) = $1, $2, $3;
但后来我不知道如何在两行中比较$phone
。
也许我会以错误的方式解决这个问题 - 我是perl的新手。
答案 0 :(得分:0)
如果您将整个文件读入内存,则可以一次搜索多行:
$file =~ m/^\s*(\d+\.\d+\s+\d+\s+ng)\n\s*(\d+\.\d+\s+\d+\s+b)/ms ;
否则你最终会编写某种状态机。
如果结尾会发生变化,你甚至可以为它们使用变量:
my $end1= 'ng' ;
my $end2= 'b' ;
$file =~ m/^\s*(\d+\.\d+\s+\d+\s+$end1)\n\s*(\d+\.\d+\s+\d+\s+$end2)/ms ;
如果你必须处理DOS换行符,请调整以适应:
$file =~ m/^\s*(\d+\.\d+\s+\d+\s+$end1)\r*\n\s*(\d+\.\d+\s+\d+\s+$end2)/ms ;
答案 1 :(得分:-1)
与此类问题一样,要么将整个文件读入内存,要么保留内存中可能需要的前一行的副本。
my $prev = <>;
if (defined($prev)) {
while (my $this = <>) {
if ($this =~ /\sb$/ && $prev =~ /\sng$/) {
# Do whatever you want with the two lines here.
print($prev);
print($this);
}
$prev = $this;
}
}