使用perl将内容从一个文件复制到另一个文件
以下代码用于将文件内容从readfile复制到writefile。我想复制到某个关键字,而不是复制到最后一个关键字使用perl将内容从一个文件复制到另一个文件,perl,copy,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 o
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);
将继续循环的下一个迭代,有效地跳过该迭代循环中的其余语句(在本例中,是最后一个)
将立即退出循环,这听起来像是您想要的。因此,您应该能够简单地将条件语句放在最后一个上
另外,我不知道为什么要将整个文件读入内存,以迭代其行?为什么不直接用普通的呢?我建议避免使用File::Slurp
,因为它有一些缺点
您没有显示任何具有预期输出的示例输入,您的描述也不清楚-您说过“我想复制到某个关键字”,但在您使用的代码中,这会从数组的开头删除项
是否要删除前后的行以及包含或不包含“页眉结尾”
此代码将仅复制标题:
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;
它将循环并不执行任何操作,直到看到头的末尾,然后跳出第一个循环并移动到第二个循环,第二个循环打印出头后面的行。将继续循环的下一次迭代,有效地跳过该迭代循环中的其余语句(在本例中,最后一个
)
将立即退出循环,这听起来像是您想要的。因此,您应该能够简单地将条件语句放在最后一个
上
另外,我不确定为什么要将整个文件读入内存,以在其行上迭代?为什么不只使用常规文件?我建议避免使用file::Slurp
,因为它有一些
您没有显示任何具有预期输出的示例输入,您的描述也不清楚-您说过“我想复制到某个关键字”,但在您使用的代码中,这会从数组的开头删除项
是否要删除前后的行以及包含或不包含“页眉结尾”
此代码将仅复制标题:
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;
它将循环并不执行任何操作,直到看到头的末尾,然后跳出第一个循环并移动到第二个循环,第二个循环将打印出头后面的行。data.txt:
fsffs
sfsfsf
sfSDFF
END OF HEADER
{ dsgs xdgfxdg zFZ }
dgdbg
vfraeer
fsffs
sfsfsf
sfSDFF
END OF HEADER { dsgs xdgfxdg zFZ }
dgdbg
vfraeer
代码:
$/
指定输入记录分隔符,默认情况下为换行符。因此,从文件读取时:
while (my $x = <$INFILE>) {
}
当您更改一个perl预定义的全局变量时,只要您需要使用该变量,就只更改该变量,然后将该变量更改回原来的状态,这被认为是一种良好的做法
如果要仅针对大括号之间的文本,可以执行以下操作:
data.txt:
fsffs
sfsfsf
sfSDFF
END OF HEADER
{ dsgs xdgfxdg zFZ }
dgdbg
vfraeer
fsffs
sfsfsf
sfSDFF
END OF HEADER { dsgs xdgfxdg zFZ }
dgdbg
vfraeer
代码段:
...
...
{
local $/ = 'END OF HEADER {';
my $pre_brace = <$DATA>;
$/ = '}';
my $target_text = <$DATA>;
chomp $target_text; #Removes closing brace
say "->$target_text<-";
}
--output:--
-> dsgs xdgfxdg zFZ <-
。。。
...
{
本地$/='头{'的结尾;
我的$pre_brace=;
$/ = '}';
我的$target_text=;
chomp$target_text;#删除右大括号
说出“->$target_textdata.txt:
fsffs
sfsfsf
sfSDFF
END OF HEADER
{ dsgs xdgfxdg zFZ }
dgdbg
vfraeer
fsffs
sfsfsf
sfSDFF
END OF HEADER { dsgs xdgfxdg zFZ }
dgdbg
vfraeer
代码:
$/
指定输入记录分隔符,默认情况下为换行符。因此,从文件读取时:
while (my $x = <$INFILE>) {
}
当您更改一个perl预定义的全局变量时,只要您需要使用该变量,就只更改该变量,然后将该变量更改回原来的状态,这被认为是一种良好的做法
如果要仅针对大括号之间的文本,可以执行以下操作:
data.txt:
fsffs
sfsfsf
sfSDFF
END OF HEADER
{ dsgs xdgfxdg zFZ }
dgdbg
vfraeer
fsffs
sfsfsf
sfSDFF
END OF HEADER { dsgs xdgfxdg zFZ }
dgdbg
vfraeer
代码段:
...
...
{
local $/ = 'END OF HEADER {';
my $pre_brace = <$DATA>;
$/ = '}';
my $target_text = <$DATA>;
chomp $target_text; #Removes closing brace
say "->$target_text<-";
}
--output:--
-> dsgs xdgfxdg zFZ <-
。。。
...
{
本地$/='头{'的结尾;
我的$pre_brace=;
$/ = '}';
我的$target_text=;
chomp$target_text;#删除右大括号
说“->$target_text我想要如下:readfile.txt fsffs sfSDFF头的结尾{dsgs xdgfxdg zFZ}标头末尾的dgdbg vfraeer数据应复制到writefile中。txt@SomeshPokarne不幸的是,这不能以注释的形式阅读。请编辑您的问题,以包括示例输入和该输入的预期输出,格式正确。您是否尝试了我显示的代码?我希望如下:readfile.txt fsffs sfSDFF E标头{dsgs xdgfxdg zFZ}的ND标头末尾的dgdbg vfraeer数据应复制到writefile中。txt@SomeshPokarne不幸的是,这是不可读的形式的评论。请编辑您的问题,以包括示例输入和该输入的预期输出,格式正确。您是否尝试了我展示的代码?一个整洁的解决方案,并解释得很好-只是为了得到一点请不要挑剔,这里有一个警告:如果文件多次包含头的字符串结尾
,这将是一个问题,因为第二次读取不会获得文件的所有其余部分。我认为最好安全起见,并在读取头后设置$/=undf;
。这是一个简洁的解决方案,解释得很好-只是为了得到一点提示tpicky,这里有一个警告:如果文件多次包含头的字符串结尾
,这将是一个问题,因为第二次读取不会获得文件的所有其余部分。我认为最好安全起见,在读取头之后设置$/=undef;
。