这是我的问题,假设我有一个文件
file1.txt
内容:
abc..
def..
ghi..
def..
和第二个文件file2.txt
,内容为:
xxx..
yyy..
zzz..
现在我要将file1.txt
中以“def”开头的所有行复制到file2.txt
,并在file2.txt
xxx...
yyy...
def...
def...
zzz...
我是perl的新手,我尝试为此编写简单的代码,但最终输出只附加在文件的末尾
#!/usr/local/bin/perl -w
use strict;
use warnings;
use vars qw($filecontent $total);
my $file1 = "file1.txt";
open(FILE1, $file1) || die "couldn't open the file!";
open(FILE2, '>>file2.txt') || die "couldn't open the file!";
while($filecontent = <FILE1>){
if ( $filecontent =~ /def/ ) {
chomp($filecontent);
print FILE2 $filecontent ."\n";
#print FILE2 $filecontent ."\n" if $filecontent =~/yyy/;
}
}
close (FILE1);
close (FILE2);
perl程序的输出是
xxx...
yyy...
zzz...
def...
def...
答案 0 :(得分:5)
我使用临时文件。
use strict;
use warnings;
my $file1 = "file1.txt";
my $file2 = "file2.txt";
my $file3 = "file3.txt";
open(FILE1, '<', $file1) or die "couldn't open the file!";
open(FILE2, '<', $file2) or die "couldn't open the file!";
open(FILE3, '>', $file3) or die "couldn't open temp file";
while (<FILE2>) {
print FILE3;
if (/^yyy/) {
last;
}
}
while (<FILE1>) {
if (/^def/) {
print FILE3;
}
}
while (<FILE2>) {
print FILE3;
}
close (FILE1);
close (FILE2);
close (FILE3);
rename($file3, $file2) or die "unable to rename temp file";
答案 1 :(得分:2)
最简单的方法是使用Tie::File
模块,它允许您以简单的字符串数组的形式访问文件。
我还使用List::MoreUtils
中的first_index
来查找插入记录的位置。
use strict;
use warnings;
use Tie::File;
use List::MoreUtils qw/ first_index /;
tie my @file1, 'Tie::File', 'file1.txt' or die $!;
tie my @file2, 'Tie::File', 'file2.txt' or die $!;
my $insert = first_index { /^yyy/ } @file2;
for (@file1) {
if ( /^def/ ) {
splice @file2, ++$insert, 0, $_;
}
}
输出(file2.txt)
xxx..
yyy..
def..
def..
zzz..
您的测试数据不会涵盖它,但file1.txt
的记录会按照它们出现的顺序插入file2.txt
。
答案 2 :(得分:2)
您可能想尝试IO::All
模块:
use IO::All;
my ($f1, $f2, $i) = (io('file1.txt'), io('file2.txt'), 1);
for (@$f2) {
splice(@$f2, $i, 0, grep /^def/, @$f1), last
if /^yyy/;
$i++;
}