以下代码用于将文件内容从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)
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,然后跳出第一个循环并移至第二个循环,这将打印出标题之后的行。