2009-04-17 125 views
20

添加一个标准的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

我会强烈建议文字:: CSV :: Slurp的任何人想要使用CSV文件工作。这个模块比我尝试过的两三个人工作得更好。次好的是CSV :: Slurp :: Simple或者这些行的东西,尽管没有Text :: CSV :: Slurp那么强大。 – Brian 2009-04-28 19:11:40

+2

使用3 arg格式的'open()'http://p3rl.org/open – 2009-07-22 16:41:10

回答

27

您有几种选择,经典的做法:

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

+0

确实像File :: Slurp方法。非常感谢! – Brian 2009-04-28 19:10:24

+0

请注意,File :: Slurp早于Perl IO层,因此不会遵守'PERL_UNICODE' /'perl -C'设置,当您尝试编写具有适当Unicode支持的Perl脚本时,这可能令人惊讶。 Path :: Tiny可能是更好的Unicode支持的替代品。 – 2017-07-04 14:24:02

15

那就是著名的 “思乐普模式”:

my @lines = <FILEHANDLE> ; 

,你还可以看到Perl Slurp Ease

+1

“slurp模式”更常用于将整个文件读取为单个标量,方法是将记录分隔符$ /设置为undef。 – ysth 2009-04-19 18:52:25

+0

我已经看到数组和标量上下文描述为slurp模式,但我已经看到更经常使用的数组样式。 – codehearted 2016-08-11 03:13:02

4

你已经掌握了一些常用技巧,但是我想说明一下,Perl会阻止你这样做,因为它的作用是非常通常你可以做同样的事情,你正在做一行一次性,这本质上更有效率。

+0

好的一点,特别是读入数组时。数组意味着按行进行顺序处理(或记录是否正在使用$ /),通常每次只能执行一个项目。但是,有些情况下适用于slurp。 – 2009-04-18 20:44:41

6

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

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的*无法打开文件,它会自动死亡。


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

+1

我不知道Perl不是缩写!感谢您的高举。 – Brian 2009-04-17 19:11:25

+1

对不起,这封信并不适合你,而是臭名昭着的Capital-P团伙。当你明确指出可执行文件时,他们会打开你的文章并且利用你的P。该语言只获得资本-P - 。虽然没有字谜。 – Axeman 2009-04-17 20:04:25

+0

re.pl#它的perl,但是它是一个read-eval-parse-loop :) – 2009-04-17 22:21:31

6

也看看Perl6::Slurp它实现啜食的Perl6版本,并在“Perl的最佳实践”一书建议。

一些例子....

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

我建议不要求使用Core分布外模块将在任何地方工作的面向对象的方法:

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

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