我有这个父模块MyApp.pm:
package MyApp;
use Moose;
use base 'Exporter';
our @EXPORT = qw(msg);
sub msg {
print "Hello msg\n";
}
1;
Run Code Online (Sandbox Code Playgroud)
这个子模块MyApp2.pm继承了它:
package MyApp2;
use Moose;
extends qw(MyApp);
1;
Run Code Online (Sandbox Code Playgroud)
当在App.cgi脚本中使用时,如下所示:
#!/usr/bin/perl
use MyApp2;
msg();
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
Undefined subroutine &main::msg called at App.cgi line 3.
Run Code Online (Sandbox Code Playgroud)
因此导出的函数在子类MyApp2中不起作用,但仅当我使用"使用MyApp"而不是"使用MyApp2"时才有效.我假设导出的函数也应该可以被子模块访问,这也扩展了父类.我做错了什么.
继承仅更改方法调用的处理方式; 函数调用或变量访问(如our @EXPORT)不受影响.
您可以将其用作方法,而不是导出函数:
use MyApp2;
MyApp2->msg;
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,MyApp为了导入msg函数而显式加载会更加清晰,并且MyApp2为了加载这个类而额外加载.
use MyApp;
use MyApp2;
msg;
Run Code Online (Sandbox Code Playgroud)
通常建议模块面向对象或通过导出函数提供接口,但不能同时执行.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |