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

Tho*_*ens 25 oop perl perl-module

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

dra*_*tun 37

这就是我通常这样做的方式:

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' );
Run Code Online (Sandbox Code Playgroud)

  • @ceving - 出于同样的原因,`package`在perl 5.14中被更改为现在允许以下语法:`package A {...}`.NB.这与`{package A; ......}`).这避免了*getchas*你可能会得到像'my`和`our`这样的东西.参考:http://perldoc.perl.org/5.14.0/functions/package.html (7认同)

enn*_*ler 17

您只需使用另一个包语句启动新包:

package PackageOne;

# ...... code

package PackageTwo;

# .... more code
Run Code Online (Sandbox Code Playgroud)

这种方法存在问题(2009年存档)

  • 问题链接已经死了 (7认同)
  • 你只能"使用"一个名称与文件名相对应的包,你只能(轻松地)"使用"一个包含与其名称对应的包的文件.除此之外,文件范围的词汇将"泄漏"到下一个包中(通过添加大括号可避免)这一事实并不是很多. (4认同)

lep*_*epe 7

这对我有用:

#!/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();
Run Code Online (Sandbox Code Playgroud)

重要的一点是,您不用“ use”,而是将其更改为“ import”(这样就不会尝试查找文件)。

  • 关于“使用”的好点子。`require` 也是如此。如果你需要 `use` 或 `require` 包 `A`,在 `use` 或 `require` 之前设置 `$INC{'A.pm'}=1`。这告诉 perl 模块已经加载,它不需要查看磁盘。对于`use`,该赋值需要在`BEGIN`块中,例如`BEGIN { $INC{'A.pm'}=1; }`。 (2认同)