Есть еще один способ сделать это:
sub foo {goto &bar}
Это сохраняет эквивалентность между foo
и bar
, даже если впоследствии bar
будет переопределено.
Вот подробное демо:
use strict;
use warnings;
sub bar {
print "This is the original bar().\n";
}
*bar_copy = \&bar;
sub bar_link {
goto &bar;
}
print "Executing bar_copy:\n";
bar_copy();
print "Executing bar_link:\n";
bar_link();
*bar = sub {print "This is bar(), redefined.\n"};
print "Executing bar_copy after redefinition:\n";
bar_copy();
print "Executing bar_link after redefinition:\n";
bar_link();
который печатает
Executing bar_copy:
This is the original bar().
Executing bar_link:
This is the original bar().
Subroutine main::bar redefined at C:\scripts\temp.pl line 19.
Executing bar_copy after redefinition:
This is the original bar().
Executing bar_link after redefinition:
This is bar(), redefined.