2017-03-08 90 views
0

我正在尋找更好的方法在文件的第一列上的內容上添加1。我加入1Perl - 通過在第一列添加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的陣列,並添加1從3號線到最後每一個內容,但我認爲這不是一個好方法。請讓我知道更新文件內容的更好方法。

#!/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; 

回答

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: $!"; 
+0

太好了。一個簡單的問題。我該怎麼辦如果我只是更新文件,而不是創建一個新文件? –

+0

對不起,還有一件事。是否可以在頂級Perl腳本中調用單行程。我用:system('perl',$ script)== 0或者死「執行$ script:\ $?= $?」失敗。調用頂級Perl腳本中的另一個perl腳本,但我不知道如何調用單線程perl。 –

+1

我已更新我的回答以迴應您的意見。 – Sean

相關問題