为每个脚本添加一个标准的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");
答案 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)
答案 2 :(得分:15)
我认为这就是你要找的东西
答案 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