0

我想从一个文件中提取所需的信息并将其附加到另一个文件中。第一个文件包含一些行作为没有特定模式的标题,并且仅以“END OF HEADER”字符串结尾。我编写了以下代码来查找标题末尾的匹配行:

$find = "END OF HEADER";                     
open FILEHANDLE, $filename_path;      
while (<FILEHANDLE>) {

     my $line = $_;                                                
     if ($line =~ /$find/) {

         #??? what shall I do here???                                                                                      
     }
}

,但我不知道如何获取文件的其余部分并将其附加到另一个文件中。

感谢您的任何帮助

4

5 回答 5

2

我想如果文件的内容不是很大,你可以将整个文件加载到一个标量中,然后用“END OF HEADER”分割它,然后在新文件中打印分割右侧的输出(附加)

open READHANDLE, 'readfile.txt' or die $!;
my $content = do { local $/; <READHANDLE> };
close READHANDLE;

my (undef,$restcontent) = split(/END OF HEADER/,$content);

open WRITEHANDLE, '>>writefile.txt' or die $!;
print WRITEHANDLE $restcontent;
close WRITEHANDLE;
于 2012-10-29T18:53:19.127 回答
1

此代码将从命令行获取文件名,打印END OF HEADER从第一个文件开始的所有文件,然后是第二个文件的所有行。请注意,输出将发送到 STDOUT,因此您必须重定向输出,如下所示:

perl program.pl headfile.txt mainfile.txt > newfile.txt

Update Now 修改为打印所有第一个文件之后的行END OF HEADER,然后是所有第二个文件

use strict;
use warnings;

my ($header_file, $main_file) = @ARGV;

open my $fh, '<', $header_file or die $!;
my $print;
while (<$fh>) {
  print if $print;
  $print ||= /END OF HEADER/;
}

open $fh, '<', $main_file or die $!;
print while <$fh>;
于 2012-10-29T18:45:49.977 回答
1
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;
}

append_file('writefile.txt', @lines);
于 2012-10-29T18:52:35.057 回答
1

我相信这会满足您的需求:

use strict;
use warnings;

my $find = 'END OF HEADER';
my $fileContents;

{
    local $/;
    open my $fh_read, '<', 'theFile.txt' or die $!;
    $fileContents = <$fh_read>;
}

my ($restOfFile) = $fileContents =~ /$find(.+)/s;

open my $fh_write, '>>', 'theFileToAppend.txt' or die $!;

print $fh_write $restOfFile;

close $fh_write;
于 2012-10-29T19:00:45.077 回答
0
my $status = 0;
my $find = "END OF HEADER";

open my $fh_write, '>', $file_write
    or die "Can't open file $file_write $!";

open my $fh_read, '<', $file_read
    or die "Can't open file $file_read $!";

LINE:
while (my $line = <$fh_read>) {

     if ($line =~ /$find/) {

         $status = 1;
         next LINE;
     }                       

     print $fh_write $line if $status;
}

close $fh_read;
close $fh_write;
于 2012-10-29T18:36:22.410 回答