サブルーチンを再定義し、古いサブルーチンも保持するにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/1843129

  •  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 モジュールは、それらすべてを自動的に処理できます。モジュールを使用したくない場合は、その方法を正確に示すソースを参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top