Perl导出到子模块

dal*_*sam 1 perl moose

我有这个父模块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"时才有效.我假设导出的函数也应该可以被子模块访问,这也扩展了父类.我做错了什么.

amo*_*mon 5

继承仅更改方法调用的处理方式; 函数调用或变量访问(如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)

通常建议模块面向对象或通过导出函数提供接口,但不能同时执行.

  • 有可能 - 而不是`extends qw(MyApp);`写`使用MyApp; 扩展qw(MyApp);`.尽管如此,这非常非常**.除非你是古茹,否则这种事情可能会让你在未来的路上绊倒你.任何需要问如何做到这一点的人都不够大师. (2认同)