让我们简单地讲,
# Foo.pm
package Foo {
my $baz = bar();
sub bar { 42 }; ## Overwrite this
print $baz; ## Before this is executed
}
无论如何,我可以从test.pl
运行代码更改$baz
的设置并导致Foo.pm
在屏幕上打印其他内容吗?
# maybe something here.
use Foo;
# maybe something here
在编译器阶段是否可以强制以上命令打印7
?
这将发出一些警告,但显示7:
sub Foo::bar {}
BEGIN {
$SIG{__WARN__} = sub {
*Foo::bar = sub { 7 };
};
}
首先,我们定义Foo::bar
。它的值将由Foo.pm中的声明重新定义,但是将触发“ Subroutine Foo :: bar redefined”警告,该警告将调用再次重新定义该子例程的信号处理程序以返回7。