在函数之前和之后,我都有标准化的注释方式。 例如,在声明我编写的任何函数之前,
!---------------------------
! NAME_OF_FUNC (no)
!---------------------------
其中no是给定文件中包含多个功能的第n个功能。
我知道函数(例如,(Fortran约定)以子例程NAME_OF_SUB
或函数NAME_OF_FUNC
开头。因此,我的最终结果将是
!---------------------------
! NAME_OF_FUNC (no)
!---------------------------
function NAME_OF_FUNC(...)
end function
!---------------------------
有人可以显示一个示例,说明如何编写bash脚本或以其他任何脚本语言编写可以遍历我所有源文件的代码以及我刚刚显示的示例的标准约定吗?
答案 0 :(得分:2)
这是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;
}