2009-11-17 9 views
21

Sono sicuro di aver letto da qualche parte che è possibile, ma ci sono alcuni trucchi che devi conoscere. Purtroppo, non riesco a trovare il tutorial o la pagina che descrive ciò che devi fare. Ho guardato attraverso lo Perl tutorials e non ho trovato quello che ricordo di aver letto. Qualcuno potrebbe indicarmi una pagina o un documento che descrive come inserire più pacchetti in un singolo file .pm?In Perl, come posso inserire più pacchetti in un singolo file .pm?

risposta

16

È sufficiente iniziare la nuova confezione con un'altra affermazione pacchetto:

package PackageOne; 

# ...... code 

package PackageTwo; 

# .... more code 

Problems with this approach (archived on 2009)

+0

Sono abbastanza sicuro nell'articolo che ho letto, c'erano altre cose che dovevi fare o problemi che potevano apparire con lo scope. –

+1

ovviamente ci saranno problemi di scoping e questo è il motivo per cui non è raccomandato, vedere il link che ho aggiunto. – ennuikiller

+4

Puoi solo usare un pacchetto con un nome che corrisponde al nome del file, e puoi solo (facilmente) usare un file che contiene un pacchetto corrispondente al suo nome. A parte questo, e il fatto che i lessicali con scope del file "colmino" nel prossimo pacchetto (evitabile aggiungendo le parentesi graffe) non c'è molto da sapere. – hobbs

4

Come fare: basta rilasciare più package istruzioni.

Gotchas Mi viene in mente: my - Le variabili non sono localizzate in pacchetti, quindi sono comunque condivise. Prima di emetterne uno, ti trovi nel pacchetto main per impostazione predefinita.

30

Questo è come io normalmente faccio:

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

A cosa serve lo scopo del blocco se il pacchetto definisce già il proprio ambito? – ceving

+1

@ceving - Per lo stesso motivo per cui 'pacchetto' è stato modificato in perl 5.14 per consentire ora la seguente sintassi:' pacchetto A {...} '. NB. Questo è lo stesso di '{pacchetto A; ...} '). Questo evita * trucchi * che potresti ottenere con cose come "mio" e "nostro". ref: http://perldoc.perl.org/5.14.0/functions/package.html – draegtun

2

Questo è ciò che ha funzionato per me:

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

Il punto importante è che invece di utilizzare "l'uso", si cambia per " import "(in questo modo non andrà a cercare il file).

+0

Il mio approccio era simile, ho appena cambiato '{package A; ...} 'per' pacchetto A {...} '. –

Problemi correlati