【问题标题】:Read specific part of a filehandle in PERL在 PERL 中读取文件句柄的特定部分
【发布时间】:2014-04-28 11:22:21
【问题描述】:

您好,我有一个大文件想要阅读。为了节省资源,我想慢慢阅读,一次一行。但是我想知道是否有办法从文件句柄中读取特定行。例如,假设我有一个 test.txt 文件,其中包含以 1 开头的十亿个数字。每个数字都在单独的行上。

1
2
3
...

所以现在我要说的是第 10 行,

open (FILE, "< test.txt") or die "$!"; 
@reads = <FILE>
print $reads[9]; 

但是,有没有一种方法可以访问 FILE 的某些部分,而无需将所有内容都读入一个大数组中,比如我想要第 10 行。

something like FILE->[9]

- 感谢您提前提供帮助!

【问题讨论】:

标签: perl


【解决方案1】:

两种方法,逐行处理您的跳转到所需的行。您可以使用输入行号变量$. 来提供帮助:

use strict;
use warnings;
use autodie;

my $line10 = sub {
    open my $fh, '<', 'text.txt';
    while (<$fh>) {
        return $_ if $. == 10;
    }
}->();

或者,您可以使用Tie::File,正如您已经注意到的那样。然而,虽然那个界面非常方便,我推荐使用它,但它也会在后台循环文件。

use strict;
use warnings;
use autodie;

use Tie::File;

tie my @array, 'Tie::File', 'text.txt' or die "Can't open text.txt: $!";

print $array[9] // die "Line 10 does not exist";

【讨论】:

    【解决方案2】:

    出于内存目的,应该使用 while 循环读取大文件,该循环将逐行读取文件:

    open my $fh, '<', 'somefile.txt';
    while ( my $line = <$fh> ) {
       //read in text line by line
    }
    

    无论哪种方式来获取该行号,您都必须读取整个文件。现在我建议使用 while 循环和计数器来打印/保存您要查找的行。

    【讨论】:

    • 非常感谢;实际上找到了一个无需读入内存即可实际执行的模块;它叫做 Tie::File
    • 不需要计数器;您可以简单地为 Perl 的特殊变量之一编写测试,$.
    • @Steve 谢谢;这非常有用 - 我也完全可以使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多