2016-05-12 50 views
0

我想打開多個文件,並複製其內容到最後一個文件打開打開多個文件及其內容複製到最後一個文件開

輸入:

file1.txt -> 1111 
file2.txt -> 2222 
file3.txt -> 3333 

輸出應該是:

file1.txt -> 1111 
file2.txt -> 2222 
file3.txt -> 1111 2222 3333 

我的代碼

#!/usr/bin/perl 
use strict; 
use warnings; 

my %data; 
my @FILES = @ARGV; 

foreach my $file (@FILES) { 
    local $/ = undef; 
    open my $fh, '<', $file; 
    $data{$file} = <$fh>; 

foreach my $key (keys %data) { 
    open (OUTFILE, ">".$file) or die "#!\n"; 
    print OUTFILE "$key"; 
} 
} 
close(OUTFILE); 
exit; 
從代碼210

輸出:

file1.txt -> file1.txt 
file2.txt -> file1.txt 
file3.txt -> file3.txt 

它不讀文件,因爲它打印的文件名,而不是它的內容,並且還我似乎無法給以前的文件的內容打印到最後一個文件。 在此先感謝

回答

2

您需要寫入不同的文件,否則在讀取其內容之前會重寫最後一個文件。然後,您可以在讀取文件時直接寫入輸出,不需要將內容存儲在散列中。如果你想使用散列,打印值,而不是鍵。

#!/usr/bin/perl 
use warnings; 
use strict; 

my $output_file = $ARGV[-1]; 
my $tmp = $output_file . "-tmp$$"; 

open my $OUT, '>', $tmp or die $!; 

while (<>) { 
    print {$OUT} $_; 
} 

rename $tmp, $output_file or die $!; 
close $OUT or die $!; 
+0

這個作品謝謝!但我不明白-tmp $$。你能告訴我它是什麼嗎? – Tomb

+0

@Tomb:'$$'是PID。它只是創建一個臨時文件,更正確地做到這一點,請參閱[File :: Temp](http://p3rl.org/File::Temp)。 – choroba

0

而且,這裏是一些代碼,會做這樣的任務:

#... 
my ($lastfile, $data) = pop @FILES; 

for (@FILES) { 
    open my $fh, "<$_" or die "$!"; 
    $data .= join '', <$fh> , "\n"; # you can change the "\n" delimiter 
    close $fh 
} 
open my $fh, '+<',$lastfile or die "$!"; 
$data .= join '', <$fh>; 
seek $fh, 0, 0; # allows to write from the beginning (in this case re-write file) 
print $fh $data; 
close $fh; 

here在讀寫模式有關打開文件句柄。
還要注意使用哪個分隔符來使結果文件更具可讀性。


編輯
你甚至可以這樣做:

$data .= "$_ -> " . join '', <$fh> , "\n"; 
中先加入

$data .= "$lastfile -> " . join '', <$fh>; 

在第二,如果你想記住在每個文件是什麼內容。

相關問題