7

これが私が達成したいことです:

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、「これが最初に再定義されました」というメッセージが表示されます。これを機能させるにはどうすればよいですか?

4

3 に答える 3

9

これは期待どおりに機能するはずです。

sub first {
    print "this is original first";
}

*original_first = \&first;

*first = sub {
    print "this is first redefined";
};
于 2009-12-03T21:49:53.913 に答える
9

あなたのコードでは、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"
于 2009-12-03T22:07:07.810 に答える