Perl:能否从主命名空间调用包中的子例程?
从主命名空间调用Perl包的子例程当然可行!
先顺带捋下你原来代码没输出的问题:你的Use Mypackage;和Package Mypackage;里的关键字得小写(Perl对关键字大小写敏感),更关键的是——use是编译时执行的,当加载Mypackage的时候,主程序里的test子例程还没被编译出来呢,这时候调用::test()相当于找一个还不存在的子例程,自然没输出。
回到你的核心需求:从主命名空间调用包中的子例程,完全没问题,主要有两种常用方式:
方式1:直接通过包名调用子例程
只要包中的子例程是包级全局子例程(别用my声明,my是词法作用域,包外访问不到),主程序就可以用包名::子例程名()的方式直接调用。
举个例子:
Mypackage.pm(注意Perl包文件通常用.pm后缀)
package Mypackage; use strict; use warnings; # 定义包级子例程 sub package_sub { print "这是来自Mypackage的子例程输出\n"; } 1; # 包文件必须返回真值,否则use会加载失败
program.pl(主程序)
use strict; use warnings; use Mypackage; # 加载包 # 直接通过包名调用子例程 Mypackage::package_sub();
方式2:用Exporter模块导出子例程
如果不想每次调用都写包名,可以用Perl自带的Exporter模块,把包中的子例程导出到主命名空间,这样主程序里就能像调用自己的子例程一样直接用。
修改下包文件:
Mypackage.pm
package Mypackage; use strict; use warnings; # 导入Exporter的import方法 use Exporter qw(import); # @EXPORT:默认导出的子例程,主程序use时自动导入 our @EXPORT = qw(exported_sub); # @EXPORT_OK:按需导出的子例程,主程序需要显式指定才会导入 our @EXPORT_OK = qw(optional_sub); sub exported_sub { print "这是被默认导出的子例程输出\n"; } sub optional_sub { print "这是需要按需导入的子例程输出\n"; } 1;
program.pl
use strict; use warnings; use Mypackage; # 自动导入@EXPORT里的exported_sub # 如果要导入optional_sub,写成:use Mypackage qw(exported_sub optional_sub); # 直接调用默认导出的子例程 exported_sub(); # 如果导入了optional_sub,也可以直接调用 # optional_sub();
关键注意点
- 包文件必须以
1;结尾,因为use语句会执行整个包文件,最后需要返回一个真值,否则包加载会失败。 - 别用
my声明需要被外部调用的子例程,my创建的是词法作用域变量/子例程,只能在定义它的代码块内访问,包外看不到。可以用our或者直接不声明(更推荐用our明确是包级元素)。
内容的提问来源于stack exchange,提问作者The nothing
相关产品推荐
相关产品推荐

