在Perl中,我如何" slurp"将几个文件的内容转换成字符串?

时间:2016-07-04 10:26:48

标签: perl

Perl有很多方便的习惯用法,可以很容易地做一些事情,包括:

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

    while (<>) { print $., $_;  }
    
  2. 通过(本地)重置输入记录分隔符$/,我可以&#34; slurp&#34;一次整个文件:

    local $/; $content = <HANDLE>;
    
  3. 但是这两个成语并没有按照我的预期一起工作:在我重置$/之后,在文件末尾用<>停止了The:以下内容给出了我的内容仅限第一个文件。

    local $/; $content = <>;
    

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

3 个答案:

答案 0 :(得分:10)

您意识到您只隐藏了多个open来电,对吗?没有一个接一个地打开所有文件就没有神奇的方法可以读取多个文件

如您所见,如果$/设置为undef

,Perl将在每个文件的末尾停止阅读

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

看起来像这样

use strict;
use warnings 'all';

my $data;
{
    local $/;
    $data .= <> while @ARGV;
}

答案 1 :(得分:8)

由于似乎没有办法一次性啜饮所有内容,因此一个紧凑的解决方案是将<>置于列表上下文中。隐式重复调用将获取所有内容。

local $/;
$data = join "", <>;

答案 2 :(得分:-3)

use File::Slurp qw/read_file/;
my $text = read_file( 'filename' ) ;