2016-05-12 8 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開くファイルについての読み取りと書き込みの両方のモードで処理します。
また、結果ファイルを読みやすくするために使用する区切り文字にも注意してください。


EDIT
あなたも、そうすることができます:あなたは、各ファイルにあったものをコンテンツ覚えておきたい場合は、最初で

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

は、第二に参加し、

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

関連する問題