在Perl中,如何将几个文件的内容"啜饮"成字符串?

ale*_*xis 10 perl

Perl有很多方便的习惯用法,可以轻松地完成常见的事情,包括:

  1. 文件读取操作符<HANDLE>(如果在没有文件句柄的情况下使用)将无缝打开并读取所有文件@ARGV,一次一行:

    while (<>) { print $., $_;  }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过(本地)重置输入记录分隔符$/,我可以立即"啜饮"整个文件:

    local $/; $content = <HANDLE>;
    
    Run Code Online (Sandbox Code Playgroud)

但是这两个成语并没有像我预期的那样完全协同工作:在我重置之后$/,<>在文件末尾用停止点啜饮:下面只给出了第一个文件的内容.

local $/; $content = <>;
Run Code Online (Sandbox Code Playgroud)

现在,我相信这种行为必须是设计的,但我并不在乎.什么是简洁的Perl习惯用法,用于将所有文件的所有内容提取到字符串中?(这个相关的问题提到了一种将文件列表粘贴到单独的字符串中的方法,这是一个开始......但如果你之后仍需要加入字符串,那就不是非常优雅了.)

Bor*_*din 10

你意识到你只是隐藏了多个open电话,对吗?如果不逐一打开所有文件,就没有神奇的方法可以读取多个文件

如您所见,如果$/设置为Perl,Perl将在每个文件的末尾停止读取undef

处理的内部机制在打开时<>删除每个文件名@ARGV,所以我建议您只使用一个while读取使用的循环,<>直到@ARGV为空

它看起来像这样

use strict;
use warnings 'all';

my $data;
{
    local $/;
    $data .= <> while @ARGV;
}
Run Code Online (Sandbox Code Playgroud)


ale*_*xis 8

由于似乎没有办法一次性扼杀所有东西,一个紧凑的解决方案将放在<>列表上下文中.隐式重复调用将获取所有内容.

local $/;
$data = join "", <>;
Run Code Online (Sandbox Code Playgroud)