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