2013-10-04 90 views
0

這是我輸入C文件使用Perl來預處理C文件

/** 
******************************************************************************** 
* @fn ChainCtrlSetJpgSnapshotFile            
* @brief 
* @param[in ]                 
* @return 
******************************************************************************** 
*/ 
eErrorT ChainCtrlSetJpgSnapshotFile(ChainCtrlT* pChainCtrl, RouteListItemT* pRoute, char * dst_chain, char *jpg_file_path) 
{ 
    ... 
} 

/** 
******************************************************************************** 
* @fn ChainCtrlSetBgFile              
* @brief 
* @param[in ]                 
* @return 
******************************************************************************** 
*/ 
eErrorT ChainCtrlSetBgFile(ChainCtrlT* pChainCtrl, RouteListItemT* pRoute, char * dst_chain, char *bg_file_path) 
{ 
    ... 
} 

我的Perl代碼

use strict; 
use warnings; 
use vars qw(@temp $index); 

open(my $FILE, "< a.c") or die $!; ; 

my @arr = <$FILE>; 
my $pos = 0; 

foreach(@arr){ 
$pos++; 
if ($_ =~ /^ \S+ \s+ \S+ \s* \((.+?) \) /xsmg) { 
    my $arg = $1; 
    $index = $pos; 
    my @arr = map /(\w+)$/, split /\W*?,\W*/, $arg; 
    @temp = map ' * @param[in/out] '."$_\n", @arr; 
} 
} 

$arr[$index - 5] = ""; 
splice @arr,$index-4,0,@temp; 
print @arr; 

close($FILE); 

誤輸出我得到

/** 
******************************************************************************** 
* @fn ChainCtrlSetJpgSnapshotFile            
* @brief 
* @param[in ]                 
* @return 
******************************************************************************** 
*/ 
eErrorT ChainCtrlSetJpgSnapshotFile(ChainCtrlT* pChainCtrl, RouteListItemT* pRoute, char * dst_chain, char *jpg_file_path) 
{ 
    ... 
} 

/** 
******************************************************************************** 
* @fn ChainCtrlSetBgFile              
* @brief 
* @param[in/out] pChainCtrl 
* @param[in/out] pRoute 
* @param[in/out] dst_chain 
* @param[in/out] bg_file_path 
* @return 
******************************************************************************** 
*/ 
eErrorT ChainCtrlSetBgFile(ChainCtrlT* pChainCtrl, RouteListItemT* pRoute, char * dst_chain, char *bg_file_path) 
{ .... 

} 

我試圖將每個函數參數的名稱添加到它上面的註釋部分。

我的代碼僅適用於最後一個函數定義,但我需要它適用於C文件中的所有函數。

我想我在splice上犯了一個錯誤,但是在foreach循環內使用splice使得它無限期地運行而沒有輸出。

回答

2

我花了半個小時看到你的程序,下面是正確的答案。它似乎只是因爲一個簡單的邏輯錯誤。所以,如果你喜歡,請給我一些分數。

use strict; 
use warnings; 
use vars qw(@temp $index); 

open(my $FILE, "< a.c") or die $!; ; 

my @arr = <$FILE>; 
my $pos = 0; 

foreach(@arr){ 
$pos++; 
if ($_ =~ /^ \S+ \s+ \S+ \s* \((.+?) \) /xsmg) { 
    my $arg = $1; 
    $index = $pos; 
    my @arr = map /(\w+)$/, split /\W*?,\W*/, $arg; 
    @temp = map ' * @param[in/out] '."$_\n", @arr; 
    $arr[$index - 5] = ""; 
    splice @arr,$index-4,0,@temp; 
} 
} 

print @arr; 
close($FILE); 
0

包含splice的三行寫在for循環和if之外。因此,它們只在文件關閉之前執行一次。

for循環的兩個結束花括號和if移至close聲明之前。

該循環與其中的拼接件一起運行,因爲它每次在循環中添加更多行到數組中。

代碼寫入方式的一個根本問題是數組@arr正在由foreach (@arr)循環處理,並且多餘的元素被拼接到循環中的數組中。當編寫這樣的代碼時,Perl擅長做「正確的事情」。您的代碼通過計數將索引保存到數組中(即$pos$index)。在索引引用的元素之前將元素拼接到數組中時,不會調整這些計數。

+0

如果我把它寫進去它會進入無限循環 –

+0

@廣告維我的錯誤與我的第一個答案。 – AdrianHHH

+0

$ arr [$ index - 5] =「」; splice @ arr,$ index-4,0,@ temp;應該在支架 –