2
  ............
 ########### NEED TO PUT ARGUMENTS HERE AS COMMENT #########
 eErrorT ChainCtrlInitChains(ChainCtrlT* pChainCtrl,
    char* name,
    int instance,
    void* pOwner,
    )
    {
       ....
    }
     .........

我想提取并将其作为注释放在函数定义之上。有许多类似的函数定义。

open(my $FILE1, "< a.c") or die $!;
@arr = <$FILE1>;

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

当我使用 $str 时它可以工作,但是我无法将参数拼接为函数定义上方的注释。

$str = <$FILE1>;    
4

1 回答 1

2

干得好:

use File::Copy;
open my $FILE,'<','a.c' or die "open failed: $!\n";
$file_slurp = do { local $/;<$FILE>};
$file_slurp =~ s{ ^ ( \w+ \s+ \w+ \s* \( (.+?) \) )}{&print_args($2,$1)}xmesg;
close($FILE) or die "Couldn't close file: $!\n";
copy "a.c","a.c.bak" or die "Copy failed: $!\n";
open my $NEW_FILE,'>','a.c' or die "Truncating a.c failed: $!\n";
print $NEW_FILE $file_slurp and unlink "a.c.bak";

sub print_args {
    ($args,$proto) = @_;
    @comments = map { ' * @param[in/out] '."$_" } split /\s*(?:^|,)\s*/,$args;
    return join "\n",(@comments,$proto)
}

首先通过删除来测试代码,unlink以便将源的备份副本保留在磁盘上。当您确信它可以执行您想要的操作时,您可以放回取消链接,以便您的原始文件似乎已被修改到位。

于 2013-10-09T12:04:52.923 回答