2016-09-15 47 views
1

我datafile.txt後有文件名列表:的Perl:打印多個文件的內容從文件中讀取文件列表

/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; 
+4

你忘了'chomp $ filename' – yonyon100

+3

你已經得到了解決問題的答案,以'chomp'來打開文件名。但是請注意 - 'foreach(<$fh>)'將所有行讀入列表,然後遍歷它。一旦你從一個文件句柄讀取,你想逐行執行(除非有_very_特定的原因),所以使用'while(<$fh>)'代替。順便說一句,只是打印出行,你可以'打印,而<$fh1>;'(但爲了更多的處理,你大多需要一個循環,當然)。 – zdim

+1

爲什麼'chomp;打印「$ _ \ n」而不是「打印」$ _「'?也就是說,爲什麼要刪除換行符並只是將其添加回來? –

回答

0
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