【问题标题】:Perl: print the contents of multiple files after reading the file list from a filePerl:从文件中读取文件列表后打印多个文件的内容
【发布时间】:2017-01-23 23:32:02
【问题描述】:

我的 datafile.txt 有文件名列表:

/tmp/dir1/file1
/tmp/dir2/file2
/tmp/dir3/file3
...
/tmp/dir100/file100

我希望我的 Perl 脚本读取这个 datafile.txt 文件并让它打印 datafile.txt 中每个文件的内容。

也就是说,如何在 Perl 中完成以下操作?

for file in `cat datafile.txt`; do
       cat $file
done

我尝试了以下方法但遇到了困难:

use strict;
use warnings;

open(my $fh, '<', '/tmp/datafile.txt');

foreach my $filename (<$fh>) {
        open(my $fh1, '<', $filename);
        foreach(<$fh1>) {
                chomp;
                print "$_\n";
        }
        close $fh1;
}

close $fh;

【问题讨论】:

  • 你忘了chomp $filename
  • 你得到了解决问题的答案,chomp要打开的文件名。但还要注意——foreach (&lt;$fh&gt;) 将所有行读入一个列表,然后对其进行迭代。一旦你从一个文件句柄中读取,你想要逐行读取(除非有一个 very 特定的理由不这样做),所以请改用while (&lt;$fh&gt;)。顺便说一句,要打印出你可以做print while &lt;$fh1&gt;; 的行(但为了更多的处理,你当然需要一个循环)。
  • 为什么是chomp; print "$_\n" 而不仅仅是print "$_"?也就是说,为什么要删除换行符并重新添加它?
  • @WilliamPursell:就目前而言,我同意这很浪费。但是,如果chompprint 之间可能存在额外处理,则可以认为这是一种好的做法。毕竟整个foreach都可以承包给print &lt;$fh1&gt;。你会提倡吗?它与在列表的最后一个元素之后添加多余的逗号,或解码所有输入并编码所有输出并仅在 Unicode 字符中工作的方式相同。这两个都被认为是很好的做法,我不会责怪您选择的不必要的chomp。但也不会
  • @WilliamPursell:但我也不会为了简单的print 而放弃chomp。 (注意print "$_" 中的双引号非常 错误,$_print 的默认参数。)

标签: bash perl


【解决方案1】:
  open my $fh_list, '<', '/tmp/datafile.txt' or die;
  while(<$fh_list>){
    chomp;
    open my $fh, '<', $_ or die "Cannot read $_\n";
    print while <$fh>;
    close $fh;
  }
  close $fh_list;

...或使用File::Slurp 并提供足够的内存,这可能只是:

use File::Slurp;
print read_file($_) for map{chomp;$_} read_file('/tmp/datafile.txt');

当然你可以用这个 linux 命令完全跳过 perl:

cat /tmp/datafile.txt | xargs cat

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-14
    • 2010-12-13
    • 2011-11-02
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多