我正在遍历一个文件,在某些条件之后我必须退一步
当文件行与正则表达式匹配时,第二个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
应该有效,但它没有,它会让我回到同一行......问题是什么?
答案 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);