【问题标题】:Add automatic header comments for all source files为所有源文件添加自动标题注释
【发布时间】:2019-09-17 06:56:48
【问题描述】:

我有一种在函数前后编写 cmets 的标准化方式。 例如,在声明我编写的任何函数之前,

 !---------------------------
 !  NAME_OF_FUNC           (no)
 !---------------------------

其中 no 是包含多个函数的给定文件中的第 n 个函数。 我知道一个函数例如以(Fortran 约定)子程序NAME_OF_SUB 或函数NAME_OF_FUNC 开头。因此,我的最终结果将是

 !---------------------------
 !  NAME_OF_FUNC           (no)
 !---------------------------
 function NAME_OF_FUNC(...)

 end function 
 !---------------------------

有人可以举例说明如何编写 bash 脚本或任何其他脚本语言的代码,该代码可以遍历我的所有源文件和我刚刚展示的标准约定吗?

【问题讨论】:

  • 是的,当然可以。
  • 在 Perl 中,您可以使用例如 File::Find::Rule 来查找所有源文件。然后你必须遍历文件并将每个文件读入一个字符串变量,然后使用正则表达式插入标题,然后覆盖旧文件(或者最好在覆盖之前先备份)
  • 可以举个例子吗?

标签: bash shell perl automation scripting


【解决方案1】:

这是一个 Perl 的例子。它在覆盖之前不进行备份(我建议您尝试改进此脚本并添加备份功能)。它也不添加子程序结束标记。但是添加该功能很容易,请尝试。它还假设您要修改当前目录及其所有子目录中的所有*.f95 文件:

use feature qw(say state);
use strict;
use warnings;
use File::Find::Rule;

my @files = File::Find::Rule->new->name('*.f95')->in('.');

for my $fn (@files) {
    open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    my $txt = do {local $/; <$fh>};
    close $fh;
    process_txt( \$txt );
    save_txt( $fn, \$txt );
}

sub save_txt {
    my ( $fn, $txt ) = @_;

    open ( my $fh, '>', $fn ) or die "Could not open file '$fn': $!";
    print $fh $$txt;
    close $fh;
}

sub process_txt {
    my ( $txt ) = @_;

    my $i = 1;
    $$txt =~ s/^(.*(?i:function|subroutine)\s+)([a-zA-Z_]+)(\s*\(.*$)/
      do_substitution($1, $2, $3, $i++)/egmx;
}

sub do_substitution {
    my ( $head, $name, $end, $i ) = @_;

    my $line = $head . $name . $end;
    $line =~ s/\s+$//;
    my $N = length $line;
    my $cline = '!' . '-' x $N;
    my $mline = '!  ' . $name;
    my $snum = "($i)";
    my $M = (length $mline) + (length $snum);
    my $mspc = ($N > $M) ? (' ' x ($N-$M)) : '  ';
    $mline = $mline . $mspc . $snum;
    my $new_txt = join "\n", $cline, $mline, $cline, $line;
    return $new_txt;
}

【讨论】:

  • 太棒了!我将破解小部分以满足我的所有需求。关于备份,您从概念上建议我如何保存它们。您的意思是在更改实际文件之前创建一个临时文件夹并转储所有源文件吗?然后只保留那个临时文件夹作为备份,以防运行 perl 脚本出现问题?
  • 不客气! “您的意思是在更改实际文件之前创建一个临时文件夹并转储所有源文件吗?” 是的,或者只是将它们写入具有.bak 扩展名的文件。以防万一出现问题,是的!
猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多