私が達成したいこと:
###############CODE########
old_procedure(arg1, arg2);
#############CODE_END######
古い手順を含む巨大なコードがあります。その old_procedure への呼び出しが、同じ引数を持つ新しいプロシージャ (new_procedure(arg1, arg2)) への呼び出しに移動することを望みます。質問はかなりばかげているように思えますが、コードやbad_functionを変更することは許可されていません。したがって、私ができる唯一のことは、コードフローなどを読み取るプロシージャを外部で作成し、bad_function が見つかるたびに、それを new_function に置き換えることです。void 型なので、戻り値を気にする必要はありません。私はperlを使用しています。誰かが少なくともこの方向で開始する方法を知っている場合...コメントまたは回答してください。新しいコードが perl または C で作成できればよいのですが、他の既知の言語でも問題ありません。C++、ジャバ.
編集: コードはシェル スクリプトと perl で書かれています。コードを編集できず、old_function の場所がわかりません。つまり、見つけることはできますが、非常に困難です。したがって、指摘されたパッケージを使用できますが、それを回避する方法があれば...その関数でスレッドを解析し、関数呼び出しを置き換えることができます。Java や C++ の専門家からの提案も必要なので、タグを削除しないでください。
編集:@mirodだから私はそれを試してみましたが、あなたの答えは新しいサブルーチンを作成しましたが、古いサブルーチンにアクセスする方法はありません。値をチェックしてどちらの方向に進むかを決定する変数を作成しました(old_subまたはnew_sub)...新しいコードに変数を追加する方法はありますか...設定されていない場合、コントロールをold_functionに戻します... お気に入り:
use BadPackage; # sub is defined there
BEGIN
{ package BapPackage;
no warnings; # to avoid the "Subroutine bad_sub redefined" message
# check for the variable and send to old_sub if the var is not set
sub bad_sub
{ # good code
}
}
# Thanks @mirod