如何转到多行字符串变量(Perl)中的特定行?

时间:2014-03-05 17:27:01

标签: perl text-files line scalar

我正在使用

将文本文件读入SCALAR变量
open FILE, "<", $filename or print("Error opening $filename");
read FILE, my $buffer, -s $filename;    
close FILE;

后来我计算了SCALAR变量中的行数。如何在没有迭代的情况下转到SCALAR变量中的特定行?

1 个答案:

答案 0 :(得分:1)

你最初提出的问题的答案是,除非你正在处理固定宽度的文件,否则你不能跳过某一行而不用某种方式迭代

但是,根据您的评论,似乎首先不需要将整个文件读入标量。您可以通过简单地遍历文件来获得倒数第二行和总行数:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my ($count, @previous);
while (<DATA>) {
    chomp;

    $count++;

    push @previous, $_;
    shift @previous if @previous > 2;
}

say "Count: $count";
say "Second-to-last line: $previous[0]";

__DATA__
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.

输出:

Count: 6
Second-to-last line: fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in

为简单起见,我使用了特殊的__DATA__块而不是外部文件。要读取上述文件,请执行以下操作:

open my $fh, '<', '/path/to/file' or die "Failed to open file: $!";

while (<$fh>) {
    ...
}

close $fh;

为什么这比将整个文件读成标量更好?如果你的文件很大,那么一次性将整个内容读入内存可能会很昂贵。除非你有充分的理由不这样做,否则通常最好一次读取一行文件并随时处理它们。