如何让间接调用的Perl模块子程序在主脚本中直接可用?
解决方法:仅修改additional.pm让hello2在主脚本可用
你可以通过以下两种方式修改additional.pm,无需改动主脚本perlprog.pl和direct.pm:
方法一:直接挂载子程序到main命名空间
Perl的命名空间由符号表控制,直接将hello2的引用赋值给main包的符号表条目,就能让主脚本直接调用该子程序:
use Modern::Perl; package additional; use base 'Exporter'; our @EXPORT = ( 'hello2' ); our %EXPORT = ( all=>[ 'hello2' ] ); sub hello2 { say sprintf 'Hello TWO got "%s"', join ',', @_; } # 将hello2直接挂载到main包的命名空间 *main::hello2 = \&hello2; 1;
方法二:使用Exporter的export_to_level主动导出到main包
利用Exporter模块的export_to_level方法,跳过中间的direct包,直接将hello2导出到主脚本所在的main包:
use Modern::Perl; package additional; use base 'Exporter'; our @EXPORT = ( 'hello2' ); our %EXPORT = ( all=>[ 'hello2' ] ); sub hello2 { say sprintf 'Hello TWO got "%s"', join ',', @_; } # 跳过direct包,直接向main包导出hello2 __PACKAGE__->export_to_level(2, __PACKAGE__, 'hello2'); 1;
原理说明
- 默认情况下,
direct.pm调用use additional时,Exporter只会将hello2导出到direct包的命名空间,主脚本无法访问。 - 方法一直接修改
main包的符号表,让main::hello2指向additional::hello2;方法二通过export_to_level指定导出层级,直接将子程序推送到主脚本的命名空间。
内容的提问来源于stack exchange,提问作者tiMbeRdroP
相关产品推荐
相关产品推荐

