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
È sufficiente iniziare la nuova confezione con un'altra affermazione pacchetto:
package PackageOne;
# ...... code
package PackageTwo;
# .... more code
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.
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');
A cosa serve lo scopo del blocco se il pacchetto definisce già il proprio ambito? – ceving
@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
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).
Il mio approccio era simile, ho appena cambiato '{package A; ...} 'per' pacchetto A {...} '. –
Sono abbastanza sicuro nell'articolo che ho letto, c'erano altre cose che dovevi fare o problemi che potevano apparire con lo scope. –
ovviamente ci saranno problemi di scoping e questo è il motivo per cui non è raccomandato, vedere il link che ho aggiunto. – ennuikiller
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