是否可以在perl中嵌套模块并将所有嵌套子例程导出到使用父模块的脚本?请考虑以下示例:
主脚本将使用ParentModule中的子程序。因此在脚本中将遵循以下行:
use ParentModule;
ParentModule
将使用ChildModule
中的子程序。因此ParentModule
将遵循以下行:
use ChildModule;
在ChildModule
下导出的子程序是否可以在主脚本下使用?
有些时候我曾问过类似的问题here而答案是否定的,但这与以前的意思不同。此外,我已经尝试了上述情况,但没有奏效。有没有其他方法可以做到这一点?
PS:所有模块都使用导出器。
谢谢
答案 0 :(得分:4)
ParentModule
需要明确提供导出的ChildModule
符号。由于您使用Exporter
,最简单的方法是:
在ChildModule.pm
:
package ChildModule;
use strict;
use warnings;
use base 'Exporter';
our @EXPORT = ( 'cf' );
sub cf { print "Child\n" }
1;
在ParentModule.pm
:
package ParentModule;
use strict;
use warnings;
use base 'Exporter';
use ChildModule;
our @EXPORT = ( 'pf', @ChildModule::EXPORT );
sub pf { print "Parent\n" }
1;
然后,
% perl -MParentModule -e 'pf; cf'
Parent
Child
但是,默认情况下,导出内容通常不是好形式。您可以使用@EXPORT_OK
播放相同的技巧,但仍需要将ChildModule
例程明确导入ParentModule
或ParentModule
,但无法将其导出
还有其他模块允许您避开最后一步(例如Import::Into),但如果您愿意,您需要在import()
中制作自定义ParentModule
例程保留简单的use ParentModule
语句。