如何将小文本文件的内容读入Perl中的标量?

时间:2009-01-28 15:38:23

标签: perl file-io

我有一个小文本文件,我想在文件中读取标量变量(保留行分隔符和其他空格)。

Python中的等价物就像是

buffer = ""

try:
    file = open("fileName", 'rU')
    try:
        buffer += file.read()
    finally:
        file.close()
except IOError:
    buffer += "The file could not be opened."

这是为了简单地重新显示网页上文件的内容,这就是我的错误信息进入我的文件缓冲区的原因。

8 个答案:

答案 0 :(得分:19)

来自Perl Cookbook

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)

如果我附近没有SlurpPerl6::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“但是会添加额外的换行符。读取时,每一行的末尾都有一个换行符。)