2013-10-04 64 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;应该在支架 –