使用join命令编辑perl中的文件内容

时间:2015-05-07 06:55:56

标签: perl

我正在执行以下操作来编辑文件中的特定行,并在编辑后将所有内容发送到另一个文件。

我输入文件的内容是: -

;first set
00 01 05 10 10 11 22 55 66
;second set
00 00 00 01 10 11 11 11 11 
;third set
00 01 05 10 ff 11 22 55 66
;fourth set
00 00 00 01 10 11 11 11 11 

在第三个集合之后的行中,第五个元素ff我想用5f替换,并将该文件的全部内容传递给另一个文件。

我编写了用5f替换第五个元素的代码,但下一行也与输出文件中编辑的行连接。

输出文件如下

;first set
00 01 05 10 10 11 22 55 66
;second set
00 00 00 01 10 11 11 11 11 
;third set
00 01 05 10 5f 11 22 55 66;fourth set
00 00 00 01 10 11 11 11 11
my $parameter = "third";
my $inputfile = $ARGV[0];
my $outputfile = "Extract"."_".$inputfile;
my $check = 0;

open(INPUT, "<$inputfile") or die $!;
open(OUT, ">$outputfile") or die $!;

while (<INPUT>)
{
    if($check == 1)
    {
        my $line = $_;
        my @chunks = split ' ', $line;
        $chunks[4] = "5f";
        $check = 0;
        print OUT join (" ", @chunks);
    }
    else
    {
        print OUT $_;
    }

    if($_ =~ m/$parameter/gi)
    {
        $check = 1;
    }
}

close(OUT); 
close(INPUT);

1 个答案:

答案 0 :(得分:1)

您的split ' ', $line命令会从字符串中删除所有空白(包括换行符),只留下数据。它与my @chunks = $line =~ /\S+/g相同。因此,您必须在打印后添加换行符。

这就是我编写解决方案的方法

use strict;
use warnings;

my $parameter = 'third';
my ($inputfile) = @ARGV;
my $outputfile = "Extract_$inputfile";

open my $in_fh,  '<', $inputfile  or die $!;
open my $out_fh, '>', $outputfile or die $!;
select $out_fh;

while ( <$in_fh> ) {
  print;
  if ( /$parameter/ ) {
    my @chunks = split ' ', <$in_fh>;
    $chunks[4] = '5f';
    print "@chunks\n";
  }
}

<强>输出

;first set
00 01 05 10 10 11 22 55 66
;second set
00 00 00 01 10 11 11 11 11 
;third set
00 01 05 10 5f 11 22 55 66
;fourth set
00 00 00 01 10 11 11 11 11