Perl:在文件读取时操作while(<>)循环

时间:2016-01-05 08:40:16

标签: perl

我的问题是关于从文件中读取行的while循环。情况是,当while循环while(<FILEHANDLE>)在当前行($_)上执行操作时,我想存储来自或整个下一行的值。那么解决这个问题的方法是什么?是否有特定的功能或模块来做这件事?

4 个答案:

答案 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;
}

(这只是一个例子,尝试编写更好的代码)

正如文档所说,文件不是一次性加载到内存中,因此它甚至可以用于大文件。