2010-06-18 11 views
8

Diciamo che ci sono due moduli che utilizzano a vicenda:Perché Perl consente reciproche relazioni "d'uso" tra i moduli?

package a; 
use b; 
sub p {} 

1; 

package b; 
use a; 
1; 

penso che sia sistematicamente sbagliato a scrivere il codice come il precedente, perché i due moduli saranno infinitamente copiare il codice di ciascuno a se stessi, ma io può eseguire correttamente il codice seguente, il che mi rende molto sorpreso. Qualcuno di voi potrebbe spiegarmi tutto questo?

#! /usr/bin/perl 
use a; 
a->p(); 
+0

'Use'ing un modulo non copiare nulla, a meno che non si imposta un '@ EXPORT' o altrimenti specificamente copiare qualcosa in un'altra tabella dei simboli. – Ether

risposta

15

perché i due moduli saranno infinitamente copiare il codice di ciascuno a se stessi

No, non lo faranno, come avete dimostrato con il codice che ti ha sorpreso lavorando. Perl mantiene una registrazione in %INC delle quali moduli sono stati caricati con use o require e non tenterà di caricarli se ottengono use d o require d nuovo.

7

Per quanto mi ricordo "uso" direttiva perl esegue verificare se il modulo è già caricato. È fatto chiamando la funzione require(). Quindi, non c'è una copia infinita.

9

Ci sono (almeno) tre diversi modi di caricare qualcosa: use, require e do.

use è fondamentalmente un pimped require e perldoc states per require: dover soddisfare requisiti che un file di libreria essere inclusa se non è già stato incluso. Quindi nessun problema lì.

do è una storia diversa. Esegue il file ed è più o meno come eval o C #include. L'inclusione reciproca tramite do dovrebbe essere fatale.

+1

'do' è il male ed è meglio evitare. – Ether

+0

Quando si obiettivo è quello di eseguire un file arbitrario (hey, questo è il Perl), piuttosto che compreso come un pacchetto di allora 'do' sembra essere la strada da percorrere. Forse non si adatta veramente in questo contesto; Ricordo solo che in questo modo perché _Beginning Perl_ elenca 'do' nel capitolo sui moduli. – musiKk

+0

Se il tuo obiettivo è eseguire un file arbitrario, potresti voler riconsiderare il tuo design. – daotoad

Problemi correlati