Perl - 通过在第一列上添加1来更新文件的内容

时间:2017-03-08 19:14:54

标签: perl updates

我正在寻找一种更好的方法来在文件的第一列上添加1内容。我通过添加1来读取文件并更新第一列的内容。

我的输入文件:(sparc_export.test)

export
3066
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rcc_data_e[6]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[51]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[3]
10500 cmp_top.iop.sparc0.exu.alu.shft_alu_shift_out_e[18]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[17]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[43]

......这将超过3000线。

我想文件是:(sparc_export.test)

export
3066
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rcc_data_e[6]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[51]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[3]
10501 cmp_top.iop.sparc0.exu.alu.shft_alu_shift_out_e[18]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[17]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[43]

我正在将文件作为2x2数组读取,并且从第3行到结尾为每个内容添加1,但我认为这不是一个好方法。请让我知道更新文件内容的更好方法。

#!/usr/bin/perl 

use strict;
use warnings;




    my $exportname="sparc_export.test";

    #### read sparc_export.test
    open(CSV,$exportname)||die("Cannot open export file $!");
    my @export;
    while(<CSV>){
        my @row=split(/ /,$_);
        push(@export,\@row);
    }

    for (my $i=2; $i < (scalar @export); $i +=1) {
            $export[$i][0]= $export[$i][0]+1;
    }


open(my $fh4, '>', 'sparc_export.test');
print $fh4 join("\n", @export);
close $fh4;

1 个答案:

答案 0 :(得分:4)

只需简短的命令而不是完整的程序就可以轻松完成:

perl -pe 's/(\d+)/$1 + 1/e if $. > 2' sparc_export.test > sparc_export_incremented.test

-p标志将整个程序包含在输入文件的行上的while循环中,if $. > 2将修改限制为行号大于2的行。

回应你的意见:

要替换原始文件而不是创建新文件,您可以说:

perl -i.bak -pe 's/(\d+)/$1 + 1/e if $. > 2' sparc_export.test

这会将原始文件保存在名称sparc_export.test.bak下。您可以只说-i而不是-i.bak来创建备份文件。

从Perl程序中调用Perl命令会很奇怪,但可以这样做:

system('perl', '-i.bak', '-pe', 's/(\d+)/$1 + 1/e if $. > 2', 'sparc_export.test');

更常见的是,人们可以在主程序中完成工作:

open my $in, '<', 'sparc_export.test' or die "Can't open file: $!";
open my $out, '>', 'sparc_export.test.out' or die "Can't open file: $!";
while (<$in>) {
  s/(\d)/$1 + 1/e if $. > 2;
  print $out $_;
}
close $out;
close $in;
rename 'sparc_export.test.out', 'sparc_export.test' or die "Failed to rename: $!";