В Perl, как поместить несколько пакетов в один файл .pm? - PullRequest
23 голосов
/ 17 ноября 2009

Я почти уверен, что где-то читал, что это возможно, но есть несколько ошибок, о которых вам нужно знать. К сожалению, я не могу найти учебник или страницу с описанием того, что вам нужно сделать. Я просмотрел учебники по Perl и не нашел того, что помню. Может кто-нибудь указать мне на страницу или документ, который описывает, как поместить несколько пакетов в один файл .pm?

Ответы [ 4 ]

35 голосов
/ 17 ноября 2009

Вот как я обычно это делаю:

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' );
16 голосов
/ 17 ноября 2009

Вы просто запускаете новый пакет с другим оператором пакета:

package PackageOne;

# ...... code

package PackageTwo;

# .... more code

Проблемы с этим подходом ( архивировано в 2009 )

5 голосов
/ 29 мая 2016

Вот что у меня сработало:

#!/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» (таким образом, он не пойдет и не попытается найти файл).

2 голосов
/ 17 ноября 2009

Как это сделать: просто введите несколько package инструкций.

Попутно я могу подумать: my -переменные не локализованы в пакетах, поэтому они в любом случае являются общими. Перед тем как выпустить, вы находитесь в пакете main по умолчанию.

...