打开文本文件并使用Perl将其读入数组的最简单方法

时间:2009-04-17 17:28:30

标签: perl

为每个脚本添加一个标准的Perl文件打开函数有点烦人:

sub openfile{
    (my $filename) = @_;
    open FILE,"$filename" or die $!;
    my @lines = <FILE>;
    return @lines;
}

我可以创建一个Perl模块来执行此操作,但这很简单,我确信应该有一个。

我正试图找到一种方法将文本文件读入数组,我似乎无法找到一个可以完成这个简单任务的Perl模块...也许我看起来太难了它已经标配5.10安装。

最好我相信它看起来像这样:

my @lines = Module::File::Read("c:\some\folder\structure\file.txt");

8 个答案:

答案 0 :(得分:27)

你有几个选择,经典的do方法:

my @array = do {
    open my $fh, "<", $filename
        or die "could not open $filename: $!";
    <$fh>;
};

IO::All方法:

use IO::All;

my @array = io($filename)->slurp;

File::Slurp方法:

use File::Slurp;

my @array = read_file($filename);

毕竟可能还有更多TIMTOWTDI

答案 1 :(得分:15)

这就是着名的“啜食模式”:

  my @lines = <FILEHANDLE> ;

您可能还会看到Perl Slurp Ease

答案 2 :(得分:15)

我认为这就是你要找的东西

File::Slurp

答案 3 :(得分:6)

您可能还想考虑使用Tie :: File,特别是如果您正在阅读较大的文件而不想将整个文件读入内存。这是一个核心模块。另请参阅perlfaq5

答案 4 :(得分:6)

另请参阅Perl6::Slurp,它实现了Perl6版本的slurp,并在“Perl Best Practices”一书中推荐。

一些例子......

my @lines         = slurp 'filename';
my @lines_chomped = slurp 'filename', { chomp => 1 };
my @lines_utf8    = slurp 'filename', { utf8  => 1 };

答案 5 :(得分:4)

你已经掌握了一般技巧,但是我想说Perl有点不鼓励你这样做,因为它非常非常通常情况下你可以做同样的事情你正在做一次一行,这本身就更有效率。

答案 6 :(得分:2)

对于快速和肮脏,我更喜欢使用@ARGV进行捣乱的简单性。

# Ysth is right, it doesn't automatically die; I need another line.
use 5.010;
use strict;
my @rows = do { 
    use warnings FATAL => 'inplace'; # oddly enough, this is the one. ??
    @ARGV='/a/file/somewhere';
    <>;
};
say q(Not gettin' here.);

如果perl *无法打开文件,它会自动死掉。


* - 可执行文件,所以请不要大写。

答案 7 :(得分:1)

我建议使用面向对象的方法,它不需要CORE发行版之外的模块,并且可以在任何地方使用:

use strict;
use warnings;
use IO::File;
my $fh = IO::File->new("< $file");

foreach ($fh->getlines) {
    do_something($_);
}
$fh->close