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

标签 perl

Perl有许多方便的成语,可以轻松地完成常见的事情,包括:

  • 如果不使用文件句柄而使用文件读取运算符<HANDLE>,它将无缝地打开并读取@ARGV中的所有文件,一次仅一行:
    while (<>) { print $., $_;  }
    
  • 通过(本地)重置输入记录分隔符$/,我可以一次“吸取”整个文件:
    local $/; $content = <HANDLE>;
    

  • 但是,这两个习惯用法并没有像我预期的那样协同工作:重置$/之后,在文件末尾停止使用<>进行混音:以下仅提供了第一个文件的内容。
    local $/; $content = <>;
    

    现在,我相信这种行为一定是设计使然,但我并不在乎。将所有文件的的所有内容提取为字符串的简洁Perl惯用语是什么? (与This相关的问题提到了一种将文件列表包含到单独的字符串中的方法,这是一个开始……但如果您以后仍需要加入字符串,则不是很优雅。)

    最佳答案

    您意识到自己只是隐藏了多个open调用,对不对?没有一种神奇的方式来读取多个文件,而不用一个个地打开所有文件

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

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

    看起来像这样

    use strict;
    use warnings 'all';
    
    my $data;
    {
        local $/;
        $data .= <> while @ARGV;
    }
    

    关于perl - 在Perl中,如何将几个文件的内容 "slurp"转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38182433/

    相关文章:

    perl - 在 Perl HoH 中访问嵌套哈希而不使用keys()?

    html - 如何使用 Perl 正则表达式替换 HTML 属性中的多个单词,每个单词散列为一个替代单词?

    带有 HTTP 状态代码的 Perl CGI

    mysql - 使用 DBD::mysql 时需要有关 perl 错误的帮助

    arrays - 为什么会出现 "Not an ARRAY reference"错误?

    perl - 当调用的参数比预期的多时,子程序是否应该嘎嘎作响?

    perl - 不正确的Perl语法会产生不正确的错误消息

    perl - 在 perl 中语言环境设置是全局的吗?

    c++ - 执行 C++ 程序并使用 Perl 复制 cmd 输出

    html - 如何使用包装器将 CSS 文件应用于我的 Catalyst webapp 中的特定模板