サブルーチンを再定義し、古いサブルーチンも保持するにはどうすればよいでしょうか?
-
12-09-2019 - |
質問
私が達成したいことは次のとおりです。
sub first {
print "this is original first";
}
*original_first = \&first;
sub first {
print "this is first redefined";
}
original_first(); # i expect this to print "this is original first"
first() # i expect this to print "this is first redefined"
のシンボルを保存することで、 first
, 、後で元のサブルーチン ( という名前の下) を呼び出すことができます。 original_first
)そして電話もできるようにする first
, 、再定義されたものを取得します。ただし、私が電話すると、 original_first
, まだ「これは最初に再定義されています」というメッセージが表示されます。これを機能させるには何をしなければなりませんか?
解決
あなたが期待するように、
この作業をする必要があります:
sub first {
print "this is original first";
}
*original_first = \&first;
*first = sub {
print "this is first redefined";
};
他のヒント
あなたのコードでは、Perlはこれに類似したサブ宣言の両方を解釈します:
BEGIN {
*first = sub { ... }
}
そう&first
する両方の割り当ては、コピーを保存し、ルーチンを呼び出す前に起こってしまいます。修正は、実行時の割り当てに2番目の宣言をすることです。
sub first {
print "this is original first";
}
*original_first = \&first;
*first = sub {print "this is first redefined"};
original_first(); # prints "this is original first"
first(); # prints "this is first redefined"
を参照してください。 フック::LexWrap モジュールは、それらすべてを自動的に処理できます。モジュールを使用したくない場合は、その方法を正確に示すソースを参照してください。
所属していません StackOverflow