如何使用Perl“跳转”到文件的一行,而不是逐行读取文件

时间:2014-01-10 21:22:59

标签: perl loops while-loop

我正在打开一个包含单个但非常长的列的文件。我想从它中检索一个短段,从指定的行开始,到另一个指定的行结束。目前,我的脚本逐行读取文件,直到找到所需的行。我正在使用:

my ( $from, $to ) = ( some line number, some larger line number );    
my $count = 1;
my @seq = ();

while ( <SEQUENCE> ) {
    print "$_ for $count\n";
    $count++;

    while ( $count >= $from && $count <= $to ) {
         push( @seq, $_ );
         last;
    }
}
print "seq is: @seq\n";

输入看起来像:

A
G
T
C
A
G
T
C
.
.
.

我怎么能“跳”到我想去的地方?

2 个答案:

答案 0 :(得分:2)

您需要使用搜索移动到文件的正确部分。参考:http://perldoc.perl.org/functions/seek.html

这适用于字节,而不是行,所以通常如果你需要使用行寻求它不是一个选项。但是,由于您正在使用固定长度的行(2或3个字节,具体取决于您平台的EOL编码),您可以将行长乘以您想要的行(0索引),并且您将位于正确的读取位置

答案 1 :(得分:2)

如果您碰巧知道所有行的长度完全相同(占行结束字符,一般在Unix / Linux上为1个字节,在Windows上为2个),您可以使用seek直接转到文件中的指定点

seek函数允许您以字节/字符指定文件位置,而不是行。在一般情况下,转到指定行号的唯一方法是从头开始读取并跳过那么多行(减去一行)。

除非你有一个索引映射行号到字节偏移量;然后,您可以在索引中查找指定的行号,并使用seek跳转到该位置。为此,您必须单独构建索引(需要读取整个文件的过程)并确保索引始终是最新的。如果文件经常更改,这可能是不切实际的。

我不知道有任何用于构建和使用此类索引的现有工具,但如果它们存在,我不会感到惊讶。但它应该很容易推出自己的。

但除非扫描文件以找到您想要的行号是一个重要的性能瓶颈,否则我不会为额外的复杂性而烦恼。