我正在寻找一种更好的方法来在文件的第一列上添加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;
答案 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: $!";