在文件中逐行退步

时间:2014-08-14 14:23:47

标签: perl file loops iteration

我正在遍历一个文件,在某些条件之后我必须退一步

当文件行与正则表达式匹配时,第二个while循环进入并且它遍历文件直到它匹配while的条件,之后我的代码必须以1行退回! / p>

while(my $line = <FL>){
 if($line =~ /some regexp/){
   while($line =~ /^\+/){
      $line = <FL>; #Step into next line
   }
   seek(FL, -length($line), 1); #This should get me back the previous line
   #Some tasks with previous line
 }
}

实际上seek应该有效,但它没有,它会让我回到同一行......问题是什么?

2 个答案:

答案 0 :(得分:1)

当您从文件句柄中读取时,它已经前进到下一行。因此,如果您返回当前行的长度,您所做的只是设置为再次读取该行。

此外,将一行的length与其在磁盘上的长度相关联假设编码为:raw而不是:crlf或其他格式。这是一个很大的假设。

您需要的是用于跟踪过去值的状态变量。没有必要逐字回滚文件句柄。

以下是您可能要做的事情的存根:

use strict;
use warnings;

my @buffer;

while (<DATA>) {
    if (my $range = /some regexp/ ... !/^\+/) {
        if ($range =~ /E/) {                   # Last Line of range
            print @buffer;
        }
    }

    # Save a buffer of last 4 lines
    push @buffer, $_;
    shift @buffer if @buffer > 4;
}

__DATA__
stuff
more stuff
some regexp
+ a line
+ another line
+ last line
break out
more stuff
ending stuff

输出:

some regexp
+ a line
+ another line
+ last line

答案 1 :(得分:0)

如下所示:(作为替代方案)

open(my $fh, '<', "$file") or die $!;#use three argument open
my $previous_line = q{}; #initially previous line would be empty
while(my $current_line = <$fh>){
  chomp;
  print"$current_line\n";
  print"$previous_line\n";
  #assign current line into previous line before it go to next line
  $previous_line = $current_line; 
}
close($fh);