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

使用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

以下代码用于将文件内容从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);
将继续循环的下一个迭代,有效地跳过该迭代循环中的其余语句(在本例中,是
最后一个

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

另外,我不知道为什么要将整个文件读入内存,以迭代其行?为什么不直接用普通的呢?我建议避免使用
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;