2016-05-12 12 views
0

Ich mag würde mehrere Dateien öffnen und kopieren deren Inhalt in die letzte Dateiöffnen Sie mehrere Dateien und kopieren Sie ihren Inhalt in die letzte Datei geöffnet

Eingang geöffnet:

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

ausgegeben werden soll:

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

meinen Code

#!/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; 

Ausgabe aus dem Code:

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

Es ist nicht die Dateien zu lesen, weil es die Dateinamen druckt, anstatt es Inhalt ist und auch scheinen kann ich nicht den Inhalt der vorherigen Dateien in die letzte Datei zu drucken. Vielen Dank im Voraus

Antwort

2

Sie müssen in eine andere Datei schreiben, sonst würden Sie die letzte Datei vor dem Lesen des Inhalts neu schreiben. Sie können dann beim Lesen der Dateien direkt in die Ausgabe schreiben, ohne den Inhalt in einem Hash speichern zu müssen. Wenn Sie den Hash verwenden möchten, drucken Sie die Werte, nicht die Schlüssel.

#!/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

das funktioniert dank! Ich verstehe das -tmp $$ nicht. Kannst du mir sagen, was ist das? – Tomb

+0

@Tomb: '$$' ist die PID. Es erstellt nur eine temporäre Datei, um es genauer zu machen, siehe [File :: Temp] (http://p3rl.org/File::Temp). – choroba

0

Auch hier ist ein Code, der eine solche Aufgabe tun:

#... 
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; 

lesen here über Datei öffnen beide Modus lesen und schreiben Griffe in.
Achten Sie auch darauf, welches Trennzeichen Sie verwenden, um die Ergebnisdatei lesbarer zu machen.


EDIT
können Sie tun, auch so:

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

in erster beitreten und

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

in der zweiten, wenn Sie sich erinnern wollen, welche Inhalte in jeder Datei war.

Verwandte Themen