我想打开多个文件并将其内容复制到上一个打开的文件
输入:
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
它没有读取文件,因为它打印文件名而不是它的内容,而且我似乎无法将以前文件的内容打印到最后一个文件中。 提前致谢
答案 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>;
如果你想记住每个文件中的内容,请在第二个。