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

Perl - update contents of a file by adding 1 on the first column

我正在寻找一种更好的方法来在文件第一列的内容上添加 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;

这可以很容易地通过一个简短的命令而不是一个完整的程序来完成:

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

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

回复您的评论:

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

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

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

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

system('perl', '-i.bak', '-pe', 's/(\d+)/ + 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/e if $. > 2;
  print $out $_;
}
close $out;
close $in;
rename 'sparc_export.test.out', 'sparc_export.test' or die "Failed to rename: $!";