使用perl将内容从一个文件复制到另一个文件

Som*_*rne 0 perl copy

以下代码用于将文件内容从readfile复制到writefile。而不是复制到最后,我想复制到某个关键字。

use strict;
use warnings;

use File::Slurp;

my @lines = read_file('readfile.txt');

while ( my $line = shift @lines) {
  next unless ($line =~ m/END OF HEADER/);
  last; # here suggest some other logic 
}

append_file('writefile.txt', @lines);
Run Code Online (Sandbox Code Playgroud)

hau*_*kex 6

next将继续执行循环的下一个迭代,从而有效跳过该循环中循环的其余语句(在本例中为last)。

last将立即退出循环,这听起来像您想要的。因此,您应该能够简单地将条件语句放在上last

另外,我不确定为什么要将整个文件读入内存以遍历其行?为什么不只使用常规while(<>)?我建议避免使用File::Slurp,因为它存在一些长期存在的问题

您没有显示任何带有预期输出的示例输入,并且您的描述不清楚-您说“我想复制最多一个关键字”,但是在您使用的代码中shift,该操作从数组的开头删除了项目。

你想删除的行之前之后,并包括包括"END OF HEADER"

此代码将仅复制标题:

use warnings;
use strict;

my $infile  = 'readfile.txt';
my $outfile = 'writefile.txt';

open my $ifh, '<', $infile  or die "$infile: $!";
open my $ofh, '>', $outfile or die "$outfile: $!";
while (<$ifh>) {
    last if /END OF HEADER/;
    print $ofh $_;
}
close $ifh;
close $ofh;
Run Code Online (Sandbox Code Playgroud)

而如果您想复制标题之后的所有内容,则可以将while上面的内容替换为:

while (<$ifh>) {
    last if /END OF HEADER/;
}
while (<$ifh>) {
    print $ofh $_;
}
Run Code Online (Sandbox Code Playgroud)

它将循环播放,直到看到为止不执行任何操作END OF HEADER,然后跳出第一个循环并移至第二个循环,这将打印出标题之后的行。