Uma abordagem de texto simples em que você substitui AnyFunction(arg1, &$arg2)
por AnyFunction(arg1, $arg2)
, a menos que precedida pela palavra function
, funcionará se seu código-fonte estiver formatado de forma razoável: nenhuma declaração de função na mesma linha de uma chamada de função, sem comentários ou newline entre function
e o nome da função, nenhum comentário contendo parênteses desequilibrados dentro de chamadas de função, etc. Isto irá capturar comentários e literais de string e pode perder algumas chamadas de função complicadas (por exemplo, não captura &$arg2
em f(g(), &$arg2)
).
Execute este script em seus arquivos, eles serão modificados no lugar. Aviso: não testado, faça backups primeiro!
#!/usr/bin/perl -pi
BEGIN { use warnings; use strict; undef $/; }
sub straighten_ampersands {
my ($args, $want_ampersands) = @_;
$want_ampersands = ($want_ampersands ? "&" : "");
$args =~ s{ ([(,]\s*) &? (\$\w) }
{ $1 $want_ampersands $2 }x;
}
s{
(\bfunction\s+|)(\w+\s+) # optional 'function' keyword, then function name
(\((?:(?>[^()]+)|(?4))*)\))) # balanced parentheses (from perlre)
}{
"$1$2" . straighten_ampersands($3, $1 ne "")
}ex