2009-04-17 88 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