我的问题是关于从文件中读取行的while循环。情况是,当while循环while(<FILEHANDLE>)
在当前行($_)
上执行操作时,我想存储来自或整个下一行的值。那么解决这个问题的方法是什么?是否有特定的功能或模块来做这件事?
答案 0 :(得分:1)
如果您想一次处理四行,并且每组行由@FCC
分隔,则需要更改perl的输入文件分隔符。
在你的剧本中放
$/="\@FCC"
这意味着,当您执行(&lt;&gt;)时,您在$ _中获得的每条记录现在都是您文件的四行。
use warnings;
use strict;
local $/="\@FCC";
while (<>) {
chomp;
#Each time we iterate, $_ is now all four lines of each record.
}
修改强>
您需要反斜杠@
答案 1 :(得分:0)
你可以从任何地方的<>
读取,而不仅仅是在循环的头部,例如
while (my $line = <>) {
chomp $line;
my $another_line = <>;
chomp $another_line;
print "$line followed by $another_line\n";
}
答案 2 :(得分:0)
假设您的文件很小(可能小于1gb),您可以将其填入数组并进行操作:
use warnings;
use strict;
my @lines;
while (<>) {
chomp;
push @lines, $_;
}
my $num_lines = @lines; #use of array in scalar context give length of array
# don't do last line (there is no next one)
$num_lines -= 1;
foreach (my $i = 0; $i < $num_lines; $i++) {
my $next_line = $i+1;
print "line $i plus $next_line:",$lines[$i],$lines[$i+1],"\n";
}
请注意,我的解决方案的语义与上面的答案略有不同。我的解决方案会打印除第一行以外的所有内容两次;如果你想要打印一次,上面的解决方案可能更有意义。
答案 3 :(得分:0)
如果您想从文件中一次读取 n 行,可以使用Tie::File并使用数组一次引用 n 元素,像这样:
use strict;
use warnings;
use Tie::File;
my $filename = 'path_to_your_file';
tie my @array, 'Tie::File', $filename or die 'Unable to open file';
my $index = 0;
my $size = @array;
while (1) {
last if ($index > $size); # Be careful! Try to do a better check than this!
print @array[$index..$index+3];
print "----\n";
$index += 4;
}
(这只是一个例子,尝试编写更好的代码)
正如文档所说,文件不是一次性加载到内存中,因此它甚至可以用于大文件。