0

这是我的输入 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,但是spliceforeach循环内使用会使它无限期地运行而没有输出。

4

2 回答 2

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);
于 2013-10-15T13:47:59.463 回答
0

包含 的三行splice写在 for 循环和 if 之外。因此它们只执行一次,就在文件关闭之前。

for将循环的两个右花括号和语句移动if到语句之前close

循环在 内的拼接处继续运行,因为它每次在循环周围都会向数组中添加更多行。

代码编写方式的一个潜在问题是循环@arr正在处理数组,并且在foreach (@arr)循环中将额外的元素拼接到数组中。当编写这样的代码时,Perl 擅长做“正确的事情”。您的代码通过计数将索引保存到数组(即$pos和)中。$index当元素在索引引用的元素之前拼接到数组中时,这些计数不会被调整。

于 2013-10-04T09:59:40.333 回答