是否可以仅为second_routine
中的exported_function
调用重新定义_function_used_by_exported_function
?
#!/usr/bin/env perl
use warnings;
use strict;
use Needed::Module qw(exported_function);
sub first_routine {
return exported_function( 2 );
}
no warnings 'redefine';
sub Needed::Module::_function_used_by_exported_function {
return 'B';
}
sub second_routine {
return exported_function( 5 );
}
say first_routine();
say second_routine();
您可以在sub second_routine
中本地重新定义sub _function_used_by_exported_function
。
package Foo;
use warnings;
use strict;
use base qw(Exporter);
our @EXPORT = qw(exported_function);
sub exported_function {
print 10 ** $_[0] + _function_used_by_exported_function();
}
sub _function_used_by_exported_function {
return 5;
}
package main;
use warnings;
use strict;
Foo->import; # "use"
sub first_routine {
return exported_function( 2 );
}
sub second_routine {
no warnings 'redefine';
local *Foo::_function_used_by_exported_function = sub { return 2 };
return exported_function( 5 );
}
say first_routine();
say second_routine();
say first_routine();
我从brian d foy的《掌握Perl》第10章第161页中提取了sub second_routine
中的typeglob赋值。sub是通过分配给typeglob来重新定义的,它只替换其中的coderef部分。我使用local
只在当前块内执行此操作。这样,外部世界就不会受到更改的影响,正如您在输出中看到的那样。
1051
1000021
1051