我有一个小文本文件,我想在文件中读取标量变量(保留行分隔符和其他空格)。
Python中的等价物就像是
buffer = ""
try:
file = open("fileName", 'rU')
try:
buffer += file.read()
finally:
file.close()
except IOError:
buffer += "The file could not be opened."
这是为了简单地重新显示网页上文件的内容,这就是我的错误信息进入我的文件缓冲区的原因。
答案 0 :(得分:19)
my $filename = 'file.txt';
open( FILE, '<', $filename ) or die 'Could not open file: ' . $!;
undef $/;
my $whole_file = <FILE>;
我会将更改本地化:
my $whole_file = '';
{
local $/;
$whole_file = <FILE>;
}
答案 1 :(得分:18)
作为Alex所说的替代方法,您可以install File::Slurp模块(命令行中为cpan -i File::Slurp
)并使用它:
use File::Slurp;
# Read data into a variable
my $buffer = read_file("fileName");
# or read data into an array
my @buffer = read_file("fileName");
请注意这个die
s(以及... croak
,但这只是从模块调用die的正确方法),因此您可能需要在eval中运行它阻止任何错误。
答案 2 :(得分:15)
如果我附近没有Slurp或Perl6::Slurp,那么我通常会去....
open my $fh, '<', 'file.txt' or die $!;
my $whole_file = do { local $/; <$fh> };
答案 3 :(得分:1)
您可以执行以下操作:
$data_file="somefile.txt";
open(DAT, $data_file);
@file_data = <DAT>;
close(DAT);
这将为您提供数组中的文件内容,您可以将其用于任何您想要的内容,例如,如果您想要每个单独的行,您可以执行以下操作:
foreach $LINE (@file_data)
{
dosomethingwithline($LINE);
}
完整用法示例:
my $result;
$data_file = "somefile.txt";
my $opened = open(DAT, $data_file);
if (!$opened)
{
$result = "Error.";
}
else
{
@lines = <DAT>;
foreach $LINE (@lines)
{
$result .= $LINE;
}
close(DAT);
}
然后您可以根据需要使用$result
。注意:此代码未经测试,但它应该给你一个想法。
答案 4 :(得分:1)
讨论了阅读文件here的各种方法。
答案 5 :(得分:1)
我没有足够的声誉发表评论,所以我为另一篇文章道歉。
@ Harold Bamford:$ /应该不是Perl程序员的一个模糊变量。初学者可能不知道,但他或她应该学习它。由于上面通过hackingwords链接的文章中所述的原因,连接方法是一个糟糕的选择。以下是文章中的相关引文:不必要地将输入文件拆分为行(join提供列表上下文),然后再次连接这些行。这个成语的原始编码器显然从未读过perlvar并学会了如何使用$ /来允许标量啜饮。
答案 6 :(得分:1)
我会像这样调整draegtun的答案,让它完全按照要求做出:
my $buffer;
if ( open my $fh, '<', 'fileName' ) {
$buffer = do { local $/; <$fh> };
close $fh;
} else {
$buffer = 'The file could not be opened.';
}
答案 7 :(得分:0)
只需将所有行连接成一个字符串:
open(F, $file) or die $!;
my $content = join("", <F>);
close F;
(以前曾建议使用join \ n \ n \ n \ n“但是会添加额外的换行符。读取时,每一行的末尾都有一个换行符。)