为了账号安全,请及时绑定邮箱和手机立即绑定

在Perl中,如何将整个文件读取为字符串?

在Perl中,如何将整个文件读取为字符串?

精慕HU 2019-11-27 10:26:54
我正在尝试打开.html文件作为一个大的长字符串。这就是我得到的:open(FILE, 'index.html') or die "Can't read file 'filename' [$!]\n";  $document = <FILE>; close (FILE);  print $document;结果是:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN但是,我希望结果看起来像:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">  <html>  <head>  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">  这样,我可以更轻松地搜索整个文档。
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

加:


 local $/;

从文件句柄读取之前。请参阅如何一次读取整个文件?, 要么


$ perldoc -q“整个文件”

请参阅相关的文件句柄的变量中perldoc perlvar和perldoc -f local。


顺便说一句,如果您可以将脚本放在服务器上,则可以拥有所需的所有模块。请参阅如何保留自己的模块/库目录?。


另外,Path :: Class :: File允许您饮和喷吐。


路径::微小给出更加方便的方法,例如slurp,slurp_raw,slurp_utf8以及他们的spew同行。


查看完整回答
反对 回复 2019-11-27
?
偶然的你

TA贡献1841条经验 获得超3个赞

我会这样做:


my $file = "index.html";

my $document = do {

    local $/ = undef;

    open my $fh, "<", $file

        or die "could not open $file: $!";

    <$fh>;

};

注意open的三参数版本的使用。它比旧的两个(或一个)参数版本安全得多。还要注意词汇文件句柄的使用。由于许多原因,词汇文件句柄比旧的裸字变体更好。我们在这里利用其中一个优势:它们超出范围时会关闭。


查看完整回答
反对 回复 2019-11-27
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您可以使用File :: Slurp模块一步完成。


use File::Slurp;


$all_of_it = read_file($filename); # entire file in scalar

@all_lines = read_file($filename); # one line per element

Perl惯用的处理文件中所有行的方法是一次执行一行:


open (INPUT, $file)     || die "can't open $file: $!";

while (<INPUT>) {

    chomp;

    # do something with $_

    }

close(INPUT)            || die "can't close $file: $!";

这比将整个文件作为一行行读取到内存中,然后一次处理一个元素要有效得多,这通常是(即使并非总是如此)错误的方法。每当您看到有人这样做时:


@lines = <INPUT>;

您应该认真思考为什么需要一次加载所有内容。这不是一个可扩展的解决方案。您可能还会发现使用标准的Tie :: File模块或DB_File模块的$ DB_RECNO绑定会更有趣,这允许您将数组绑定到文件,以便访问数组中的元素实际上是访问文件中的相应行。 。


您可以将整个文件句柄内容读入标量。


{

local(*INPUT, $/);

open (INPUT, $file)     || die "can't open $file: $!";

$var = <INPUT>;

}

这会暂时取消记录分隔符的定义,并将在块退出时自动关闭文件。如果文件已经打开,请使用以下命令:


$var = do { local $/; <INPUT> };

对于普通文件,您还可以使用读取功能。


read( INPUT, $var, -s INPUT );

第三个参数测试INPUT文件句柄上数据的字节大小,并将那么多字节读入缓冲区$ var。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 906 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信