次のファイルがあるとします。プロジェクト。&$
関数が呼び出されたときにパターンを含むフォルダ内のすべてのファイルを検索したいと思います。
たとえば、次のものを置き換える必要があります。
AnyFunction(&$arg);
そして
AnyFunction($arg);
AnyFunction
パターンに一致する未知の関数はどこにありますか?
この問題を解決するにはこれが必要です。PHPの問題。
可能であれば、関数がパターンと一致する場合、その宣言も変更されることを願っています。
function AnyFunction(&$arg)
どうすればいいですか?
ベストアンサー1
ソースコードの形式が正しい場合、単語が前に来ない限り、単純なテキストアプローチが機能します。AnyFunction(arg1, &$arg2)
関数呼び出しと同じ行に関数宣言がなく、関数名の間にコメントや改行がなく、関数呼び出し内の括弧の周りにバランスのとれたコメントは含まれません。 、等。これにより、コメントと文字列リテラルをキャプチャし、いくつかの複雑な関数呼び出しを見逃すことがあります(たとえば、キャプチャできません)。AnyFunction(arg1, $arg2)
function
function
&$arg2
f(g(), &$arg2)
ファイルからこのスクリプトを実行すると、その場所で変更されます。警告:テストされていません。まずバックアップしてください!
#!/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