在Perl中,如何将多个包放在一个.pm文件中?
我很确定我在某个地方读到过,这是可能的,但是有一些问题你需要注意。不幸的是,我找不到描述您需要做什么的教程或页面。我看了一遍,没有找到我记得读过的那本。有人能给我指一个页面或文档,描述如何将多个包放入一个.pm文件中吗?您只需用另一个包语句开始新包:在Perl中,如何将多个包放在一个.pm文件中?,perl,oop,perl-module,Perl,Oop,Perl Module,我很确定我在某个地方读到过,这是可能的,但是有一些问题你需要注意。不幸的是,我找不到描述您需要做什么的教程或页面。我看了一遍,没有找到我记得读过的那本。有人能给我指一个页面或文档,描述如何将多个包放入一个.pm文件中吗?您只需用另一个包语句开始新包: package PackageOne; # ...... code package PackageTwo; # .... more code ()如何操作:只需发出多个程序包指令 我能想到的问题是:my-变量不是包本地化的,所以它们是共享的
package PackageOne;
# ...... code
package PackageTwo;
# .... more code
()如何操作:只需发出多个
程序包
指令
我能想到的问题是:
my
-变量不是包本地化的,所以它们是共享的。在发出任何命令之前,默认情况下,您处于packagemain
中。我通常是这样做的:
use strict;
use warnings;
use 5.010;
{
package A;
sub new { my $class = shift; bless \$class => $class }
sub hello { say 'hello from A' }
}
{
package B;
use Data::Dumper;
sub new { my $class = shift; bless { @_ } => $class }
sub hello { say 'Hello from B + ' . shift->dump }
sub dump { Dumper $_[0] }
}
$_->hello for A->new, B->new( foo => 'bar' );
这就是我的工作原理:
#!/usr/bin/perl
use strict;
use warnings;
{
package A;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(a_sub);
our @EXPORT = qw(a_sub);
sub a_sub {
# your code ...
}
}
{
package B;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(b_sub);
our @EXPORT = qw(b_sub);
sub b_sub {
# your code ...
}
}
# Main code starts here ##############
use boolean;
use Data::Dumper;
import A qw(a_sub);
import B qw(b_sub);
a_sub();
b_sub();
重要的一点是,不要使用“use”,而是将其更改为“import”(这样它就不会去尝试查找文件) 我很确定在我读到的文章中,你还需要做一些其他的事情,或者范围界定可能会出现问题。当然,范围界定会有问题,这就是为什么不建议这样做的原因,请参阅我添加的链接。你只能
使用一个名称与文件名对应的包,你只能(轻松地)使用它使用
包含与其名称对应的包的文件。除此之外,文件范围的词汇将“泄漏”到下一个包中(可通过添加大括号避免)这一事实也没有太多需要知道的。问题链接已失效您可以通过“归档”访问该链接:如果包已经定义了它自己的作用域,那么块作用域有什么好处?@ceving-原因与在perl 5.14中将package
更改为现在允许以下语法相同:package A{…}
。注意。这与{package A;..}
相同。这避免了您可能会遇到的问题,例如my
&our
。关于导出、导入和继承呢?我的方法是类似的,我只是将{package A;…}
更改为package A{…}
。关于的使用非常好。require
也是如此。如果需要使用
或要求
软件包A
,请在使用
或要求
之前设置$INC{'A.pm'}=1
。这告诉perl模块已经加载,并且不需要查看磁盘。对于use
,该赋值需要在BEGIN
块中,例如BEGIN{$INC{'a.pm'}=1;}
。是否可以这样导入常量(use constant
)?有了使用严格的我发现不能使用赤字…
@U.Windl:如果你问这个问题(自己的帖子)会很好请举例说明您想做什么,并将此问题或答案链接起来以供参考。@lepe:请看,当您仅使用package
关键字时,您不能使用use package
。您不可能拥有全部,是吗?:)