型グロブの代入
*ExistingClass::oldExistingFunction = *ExistingClass::existingFunction;
速くて汚い。existingFunctionこれにより、すべてのシンボルが にエイリアスされoldExistingFunctionます。これには、関心のあるサブルーチンが含まれますが、たまたま同じ名前を持つ可能性のあるスカラー、配列、ハッシュ、ハンドルも含まれます。
- 利点: 何も考えずに、ただ機能するだけです。"素早い"
- デメリット:「汚い」
コードリファレンスの割り当て
*ExistingClass::oldExistingFunction = \&ExistingClass::existingFunction;
# or something using *ExistingClass::symbol{CODE}
それはサブをエイリアスするだけです。これはまだパッケージ stash で行われているため、oldExistingFunctionシンボルはグローバルに表示されます。これは、必要な場合とそうでない場合があります。おそらくそうではありません。
- 利点: エイリアシングが他の変数型に「漏れる」ことはありません。
- 短所:より多くの思考、より多くのタイピング。*...{CODE} 構文を使用する場合は、さらに多くのことを考えます (個人的には、毎日使用するわけではありません)。
レキシカルコードリファレンス
my $oldFunction = \&ExistingClass::existingFunction;
Usingmyは、現在のブロック/ファイルにのみ表示される古い関数への参照を保持します。外部コードがあなたの助けなしにそれを手に入れる方法はもうありません。呼び出し規約に注意してください。
$self->$oldFunction(@args);
$oldFunction->($self, @args);
- 利点: 視認性の問題がなくなりました
- 短所:正解しにくい
ムース
jrockwayの回答を参照してください。グロブや参照をいじることはもうないので、それは正しい方法でなければなりませんが、それを説明するのに十分なことはわかりません。