Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,如何将多个包放在一个.pm文件中?_Perl_Oop_Perl Module - Fatal编程技术网

在Perl中,如何将多个包放在一个.pm文件中?

在Perl中,如何将多个包放在一个.pm文件中?,perl,oop,perl-module,Perl,Oop,Perl Module,我很确定我在某个地方读到过,这是可能的,但是有一些问题你需要注意。不幸的是,我找不到描述您需要做什么的教程或页面。我看了一遍,没有找到我记得读过的那本。有人能给我指一个页面或文档,描述如何将多个包放入一个.pm文件中吗?您只需用另一个包语句开始新包: package PackageOne; # ...... code package PackageTwo; # .... more code ()如何操作:只需发出多个程序包指令 我能想到的问题是:my-变量不是包本地化的,所以它们是共享的

我很确定我在某个地方读到过,这是可能的,但是有一些问题你需要注意。不幸的是,我找不到描述您需要做什么的教程或页面。我看了一遍,没有找到我记得读过的那本。有人能给我指一个页面或文档,描述如何将多个包放入一个.pm文件中吗?

您只需用另一个包语句开始新包:

package PackageOne;

# ...... code

package PackageTwo;

# .... more code

()

如何操作:只需发出多个
程序包
指令


我能想到的问题是:
my
-变量不是包本地化的,所以它们是共享的。在发出任何命令之前,默认情况下,您处于package
main
中。

我通常是这样做的:

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
。您不可能拥有全部,是吗?:)