2009-07-17 16 views

risposta

24

I moduli sono un singolo file, un .pm file che fornisce il codice. Questo potrebbe essere nessun pacchetto, un singolo pacchetto o più di un pacchetto. A un modulo non interessa molto ciò che è contenuto, quindi può essere un codice che si inserisce nello stesso spazio dei nomi, un insieme più tradizionale di subroutine in una libreria o definisce l'idea di Perl di una classe.

Un pacchetto, noto anche come spazio dei nomi, contiene le proprie variabili e subroutine. È un modo per separare diverse parti del tuo programma. È possibile creare il pacchetto e mettere il codice in esso:

package SomePackage; 

sub some_subroutine { ... } # really SomePackage::some_subroutine 

Si carica il modulo per ottenere l'accesso al pacchetto:

use SomePackage; # read and compile the module file 

SomePackage::some_subroutine(...); 

classe A Perl è un pacchetto e il suo comportamento associato. I metodi in una classe sono sottoprogrammi solo normali, anche quando trattiamo subroutine come metodi, il primo parametro è la cosa (nome di un pacchetto o di un oggetto, noto anche come referente) che ha chiamato metodo:

package SomeClass; 

sub class_method { my($class, @args) = @_; ... } 
sub instance_method { my($self, @args) = @_; ... } 

Da la classe è solo un pacchetto di come qualsiasi altro pacchetto, e probabilmente vive in un modulo, si accede allo stesso modo con use:

use SomeClass; 

my $i = SomeClass->class_method(...); 

la sintassi OO freccia fa alcune cose speciale per lasciare che la subroutine some_method sapere che è essere chiamato come metodo Perl mette il referente (lo SomeClass in questo caso) come primo argomento. Inoltre, quando si utilizza la sintassi OO, Perl sa usare le sue caratteristiche di ereditarietà.

metodi chiamati con '->' ottenere il referente come primo parametro al metodo, in modo da questa chiamata:

SomeClass->new('world'); 

è sintatticamente il se si fosse chiamato con il nome della classe come primo parametro:

SomeClass::new('SomeClass' ,'world'); # no inheritance this way 

Funziona allo stesso modo anche per gli oggetti. Quando un oggetto è il referente:

my $i = SomeClass->new(); 
$i->bar('world'); 

l'oggetto è il primo parametro come metodo:

SomeClass::bar($i, 'world'); 
+0

Questo è un modo abbastanza approssimativo per dire che Perl <6 non ha classi ;-) – innaM

+0

Anche se, detto questo, mi piace * come * quel comportamento. Soprattutto, ho avuto un po 'di difficoltà da PHP per ottenere questo modo di pensare, voglio dire, non ha (e non avrà mai, (* inserisce le dita nell'orecchio *)) supporto di namespace funzionante. –

+5

I pacchetti non sono ambiti. Hanno un ambito lessicale, ma non definiscono un ambito. –

12

Perl non ha classi. Dispone di spazi dei nomi modificati con package. Per i dettagli completi di Perl OOP, vedere Perl intermedio o Perl orientato agli oggetti. È inoltre possibile visualizzare la documentazione perltoot e perlboot. In breve, Perl simula ciò che le persone si aspettano che le classi "reali" siano con pacchetti, subroutine normali e riferimenti.

Un modulo è un pezzo di codice distribuibile contenuto in un file. Vedi perlmod.


dico di più su questo nel mio post per The Effective Perler, Find a module's release managers. Non entrerò nel materiale OO, ma parlo degli altri termini relativi al "modulo".

Problemi correlati