可能是重复问题:
如何在Perl中将文件读入变量中的最佳方法是什么?
这段代码能否很好地将一个文件的内容读入Perl中的变量?虽然它可以工作,但我想知道是否有更好的做法。
open INPUT, "input.txt";
undef $/;
$content = <INPUT>;
close INPUT;
$/ = "\n";
可能是重复问题:
如何在Perl中将文件读入变量中的最佳方法是什么?
这段代码能否很好地将一个文件的内容读入Perl中的变量?虽然它可以工作,但我想知道是否有更好的做法。
open INPUT, "input.txt";
undef $/;
$content = <INPUT>;
close INPUT;
$/ = "\n";
我认为常见做法是这样的:
my $content;
open(my $fh, '<', $filename) or die "cannot open file $filename";
{
local $/;
$content = <$fh>;
}
close($fh);
使用三个参数的open
更加安全。将文件句柄作为变量使用是现代Perl应该使用的方式,而使用local $/
可以在块结束时恢复$/
的初始值,而不是硬编码的\n
。
local $/
的作用是什么吗?这个问题在谷歌上不太好搜索 :) - Miroslav Popov$/
与$INPUT_RECORD_SEPARATOR
相同。perlvar文档涵盖了它。具体来说,它使$content = <$fh>
能够读取整个文件,而不仅仅是第一行。 - n0rdlocal $/;
实际上是 local $/ = undef;
,这会欺骗 <FH>
读取完整文件。这样做正确吗?(Perl 不是 .NET。我们必须阅读未写的内容。) - Miroslav Popovuse File::Slurp;
my $content = read_file( 'input.txt' ) ;
IO::All
:use IO::All;
my $contents;
io('file.txt') > $contents;
一些可能性有点疯狂,但它们也可以非常有用。
>
运算符,仅仅是为了读取一个文件,这似乎有些过头了。每个 Perl 程序员都应该能够轻松完成这个任务,不需要如此复杂的操作。 - tchristreadfile
)才是。但是为什么要对CPAN模块进行攻击呢?它们是Perl的优势,不利用它们是愚蠢的。甚至还发明了一个反感它们的战斗术语,这肯定不是好事。 - daxim
open(my $fh, "< :encoding(UTF-8)", "input.text") || die "can't open input.text: $!"; $content = do { local $/; <$fh> }; close($fh) || die "can't close input.text: $!";
- tchrist