打开多个文件并将其内容复制到上一个打开的文件

时间:2016-05-12 13:33:31

标签: perl

我想打开多个文件并将其内容复制到上一个打开的文件

输入:

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;

代码输出:

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

它没有读取文件,因为它打印文件名而不是它的内容,而且我似乎无法将以前文件的内容打印到最后一个文件中。 提前致谢

2 个答案:

答案 0 :(得分: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 $!;

答案 1 :(得分: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>;

如果你想记住每个文件中的内容,请在第二个。