Leo*_*ans 72
这个怎么样:
use File::Slurp;
my $text = read_file($filename);
Run Code Online (Sandbox Code Playgroud)
ETA:注意File-Slurp的Bug#83126:带编码的安全漏洞(UTF-8).我现在建议使用File :: Slurper(免责声明:我写了它),也因为它有更好的默认编码:
use File::Slurper 'read_text';
my $text = read_text($filename);
Run Code Online (Sandbox Code Playgroud)
use Path::Tiny;
path($filename)->slurp_utf8;
Run Code Online (Sandbox Code Playgroud)
bri*_*foy 44
我喜欢用do
我在本地化的块来做这个,@ARGV
所以我可以使用菱形运算符来为我做文件魔术.
my $contents = do { local(@ARGV, $/) = $file; <> };
Run Code Online (Sandbox Code Playgroud)
如果您需要更强大一些,可以轻松将其转换为子程序.
如果您需要能够处理各种特殊情况的强大功能,请使用File :: Slurp.即使您不打算使用它,请查看源代码以查看它必须处理的所有古怪情况. File :: Slurp有一个很大的安全问题,看起来没有解决方案.部分原因是它无法正确处理编码.即使我的快速回答也有这个问题.如果您需要处理编码(可能因为您没有默认设置UTF-8),这将扩展为:
my $contents = do {
open my $fh, '<:encoding(UTF-8)', $file or die '...';
local $/;
<$fh>;
};
Run Code Online (Sandbox Code Playgroud)
如果您不需要更改文件,则可以使用File :: Map.
Sch*_*ern 35
在编写File :: Slurp(这是最好的方式)时,Uri Guttman在许多啜饮方式方面做了大量研究,效率最高.他在这里写下了他的发现并将它们整合到了信息文件:: Slurp.
dre*_*ves 22
open(my $f, '<', $filename) or die "OPENING $filename: $!\n";
$string = do { local($/); <$f> };
close($f);
Run Code Online (Sandbox Code Playgroud)
Tan*_*lus 11
要考虑的事情(特别是与其他解决方案相比):
所以我得到:
my $contents = do {
local $/;
open my $fh, $filename or die "Can't open $filename: $!";
<$fh>
};
Run Code Online (Sandbox Code Playgroud)
除非实际使用魔法<>,否则我不是魔法<>的忠实粉丝.而不是假装,为什么不直接使用公开电话?这不是更多的工作,而是明确的.(真正的魔法<>,特别是在处理" - "时,要完美仿效更多的工作,但我们不管怎样在这里使用它.)
dwa*_*ing 10
当您执行以下操作时,字符串的mmap(内存映射)可能很有用:
#!/usr/bin/perl
use warnings; use strict;
use IO::File;
use Sys::Mmap;
sub sip {
my $file_name = shift;
my $fh;
open ($fh, '+<', $file_name)
or die "Unable to open $file_name: $!";
my $str;
mmap($str, 0, PROT_READ|PROT_WRITE, MAP_SHARED, $fh)
or die "mmap failed: $!";
return $str;
}
my $str = sip('/tmp/words');
print substr($str, 100,20);
Run Code Online (Sandbox Code Playgroud)
更新:2012年5月
用File :: Map替换Sys :: Mmap之后,以下应该非常相同
#!/usr/bin/perl
use warnings; use strict;
use File::Map qw{map_file};
map_file(my $str => '/tmp/words', '+<');
print substr($str, 100, 20);
Run Code Online (Sandbox Code Playgroud)
{
open F, $filename or die "Can't read $filename: $!";
local $/; # enable slurp mode, locally.
$file = <F>;
close F;
}
Run Code Online (Sandbox Code Playgroud)
对于单行代码,您通常可以使用开关(-0
with -n
)让 perl 一次读取整个文件(如果文件不包含任何空字节):
perl -n0e 'print "content is in $_\n"' filename
Run Code Online (Sandbox Code Playgroud)
如果它是二进制文件,您可以使用-0777
:
perl -n0777e 'print length' filename
Run Code Online (Sandbox Code Playgroud)
这既不快,也不独立于平台,而且确实很邪恶,但这很短(我已经在拉里·沃尔(Larry Wall)的代码中看到了这一点;-):
my $contents = `cat $file`;
Run Code Online (Sandbox Code Playgroud)
孩子们,不要在家做;-)。
use IO::All;
# read into a string (scalar context)
$contents = io($filename)->slurp;
# read all lines an array (array context)
@lines = io($filename)->slurp;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26481 次 |
最近记录: |