2015-06-28 33 views
1

使用我的oneliners,我經常想要在字符串中獲取整個文件。只有核心模塊我知道考慮$file = 'foo'唯一的解決方案是:使用ony核心模塊在Perl中讀取整個文件的最短途徑

$str = do {local $/; open $fh, '<', $file; <$fh>}; 

或者

$str = qx{cat $file}; 

第二種方法是短寫,比較容易理解,但涉及幕後會更加複雜( sys_execve)。

有沒有更好的方法或我不知道的好糖?

+0

也看到了一個簡單而有效的讀/寫/修改[哪有我將整個文件讀入一個字符串?](http://stackoverflow.com/questions/953707/in-perl-how-can-i-read-an-entire-file-into-a-string)和[什麼是在Perl中將文件翻譯成字符串的最佳方式?](http://stackoverflow.com/questio NS/206661 /什麼,是最最好的方式對啜食,一個文件 - 到 - 一個字符串,在-perl的)。 –

+2

秒不短。它只是看起來這樣,因爲你忘了你需要錯誤檢查。打開文件時出現的問題是最常見的錯誤! – ikegami

+0

「有了我的線索,我經常想要在一個字符串中獲取整個文件。」 'perl -0777 -nwE'say $ _'/ path/to/file' – ThisSuitIsBlackNot

回答

2

另一種方式是:

my $file_content = do{local(@ARGV,$/)=$filename;<>}; 

,很酷吧?這可以通過本地化@ARGV並將$ filename保存爲@ARGV的第一個元素 來實現。空鑽石運營商<>自動 將打開一個文件句柄給@ARGV的第一個元素,即 文件名。如果您需要設置一個PerlIO的層,文件句柄的名字是 ARGV所以你可以用binmode設置層(前檔 閱讀!):

http://perltricks.com/article/21/2013/4/21/Read-an-entire-file-into-a-string

的Perl 6(仍然在阿爾法版本)有一個內置的功能,以吸入文件。也就是說,要將整個文件的 內容讀入標量變量。

my $data = slurp $filename; 

http://perl6maven.com/perl6-files

+1

好的黑客,我喜歡它。不幸的是,對於新手來說,它仍然非常隱祕。 Perl錯過了一種本地方式來讀取文件* ie *'$ str = slurp($ file)' – nowox

+1

「Perl 6有一個內置的函數用於讀入文件,也就是將整個文件的內容讀入標量變量「。 http://perl6maven.com/perl6-files – frhack

+0

Perl 6仍然是alpha版本。 http://perl6.guide/ – frhack

1

有在CPAN一個很好的模塊,這樣做:File::Slurp,完整的文件

# read in a whole file into a scalar variable ($text) 
my $text = read_file($filename) ; 
+0

事實上,它是好的,但不是核心模塊的一部分,因此它不是一個非常兼容的解決方案: – nowox

+4

我不明白爲什麼人們在Perl中反對模塊,只想使用核心庫。並幫助人們編寫自己的功能實現。你從來沒有看到像java這樣的其他語言的許多人說我只想使用核心的Java庫,沒有其他的罐子。 –

+0

不是很少安裝一個新模塊需要本地編譯它,當你做「make」它會失敗。 – frhack