Enquanto uma única expressão regular de complexidade desconhecida poderia, sem dúvida, fazer o trabalho, mais fácil de entender e manter pode ser um analisador linha por linha, com a ressalva óbvia de que este é um analisador incorreto que pode ser facilmente confundido se comentar Cadeias semelhantes a expressões aparecem em partes sem comentários do código (provavelmente há um lexer disponível para o idioma no CPAN, ou veja Parse: : MGC para uma maneira um pouco mais formal de fazer esse tipo de coisa).
#!/usr/bin/env perl
use strict;
use warnings;
my @comment;
# read stuff from standard input or files on argument line, whatever
LINE: while (<>) {
# assume this is a comment, start saving lines
if (m{^\s*/\*\*}) {
push @comment, $_;
next LINE;
}
if (@comment) {
push @comment, $_;
# here things end, or so we hope...
if (m{^\s*\*/}) {
# not copyright means fixup of the saved comment block...
if ($comment[1] !~ m/Copyright/) {
$comment[0] =~ s{/\*\*}{/*!};
if (@comment > 2) {
for my $i (1..$#comment-1) {
$comment[$i] =~ s{^(\s*)\*(\s)}{$1 $2};
}
}
}
# emit and reset
print for @comment;
@comment = ();
}
next LINE;
}
# hopefully only not-comment lines
print;
}