2009-11-17 13 views
21

Jestem prawie pewien, że przeczytałem gdzieś, że jest to możliwe, ale jest kilka gier, o których musisz wiedzieć. Niestety nie mogę znaleźć samouczka ani strony opisującej, co musisz zrobić. Przejrzałem numer Perl tutorials i nie znalazłem tego, który pamiętam. Czy ktoś mógłby wskazać mi stronę lub dokument opisujący, jak umieścić wiele pakietów w pojedynczym pliku .pm?W Perlu, jak umieścić wiele pakietów w jednym pliku .pm?

Odpowiedz

16

po prostu rozpocząć nowy pakiet z innego rachunku pakietu:

package PackageOne; 

# ...... code 

package PackageTwo; 

# .... more code 

Problems with this approach (archived on 2009)

+0

Jestem prawie pewien, że w artykule, który przeczytałem, było kilka innych rzeczy, które musieliście zrobić lub problemy, które mogą pojawić się przy określaniu zakresu. –

+1

oczywiście będą problemy z zakresu i dlatego nie jest zalecane, zobacz link dodałem. – ennuikiller

+4

Możesz "używać" pakietu o nazwie odpowiadającej nazwie pliku i możesz tylko (łatwo) "użyć" pliku zawierającego pakiet odpowiadający jego nazwie. Poza tym i faktem, że leksykony o zasięgu plików będą "przeciekać" do następnego pakietu (można tego uniknąć, dodając nawiasy klamrowe), nie trzeba wiele wiedzieć. – hobbs

4

Jak to zrobić: wystarczy wydać kilka package instrukcjami.

Gotchas Mogę myśleć: my -zmienne nie są zlokalizowane w pakiecie, więc i tak są udostępniane. Przed wydaniem, domyślnie znajdujesz się w pakiecie main.

30

To jest jak zwykle zrobić go:

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'); 
+0

Jaki zakres bloków jest dobry, jeśli pakiet definiuje już swój zakres? – ceving

+1

@ceving - Z tego samego powodu, dla którego 'pakiet' został zmieniony w perlu 5.14, aby teraz zezwolić na następującą składnię:' package A {...} '. NB. Jest to to samo co '{package A; ...} '). W ten sposób unikniesz * gotchów *, które możesz uzyskać za pomocą takich rzeczy jak 'my' &' our'. ref: http://perldoc.perl.org/5.14.0/functions/package.html – draegtun

2

To co pracował dla mnie:

#!/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(); 

Ważną rzeczą jest to, że zamiast używać „użytkowania”, należy zmienić go na " import "(w ten sposób nie pójdzie i spróbuje poszukać pliku).

+0

Moje podejście było podobne, właśnie zmieniłem '{package A; ...} 'to' package A {...} '. –

Powiązane problemy