2010-06-18 6 views
8

Digamos que hay dos módulos que utilizan mutuamente:¿Por qué Perl permite relaciones mutuas de "uso" entre módulos?

package a; 
use b; 
sub p {} 

1; 

package b; 
use a; 
1; 

Creo que es sistemáticamente incorrecta de escribir código como el anterior, debido a que los dos módulos sin fin copiar el código de cada uno para sí mismos, pero puede ejecutar con éxito el siguiente código, lo que me sorprende mucho. ¿Podrían alguno de ustedes explicarme todo esto?

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

'El uso de un módulo no copia nada, a menos que configure una' @ EXPORT 'o bien copie algo específicamente en otra tabla de símbolos. – Ether

Respuesta

15

porque los dos módulos sin fin copiar el código de cada uno para sí mismos

No, no lo harán, como se demuestra con el código que ha sorprendido por trabajo. Perl mantiene un registro en %INC cuyos módulos se han cargado con use o require y no intentará volver a cargarlos si obtienen use d o require d de nuevo.

7

Por lo que recuerdo, la directiva "use" perl realiza la comprobación de si el módulo ya está cargado. Se hace llamando a la función require(). Entonces, no hay una copia sin fin.

9

Hay (al menos) tres formas diferentes de cargar algo: use, require y do.

use es básicamente un pimped require y perldoc states para require: requieren exigencias que un archivo de biblioteca se incluirá si ya no se ha incluido. Así que no hay problema allí.

do es una historia diferente. Ejecuta el archivo y es más o menos como eval o C #include. La inclusión mutua a través de do debe ser fatal.

+1

'do' es malo y es mejor evitarlo. – Ether

+0

Cuando su objetivo es ejecutar un archivo arbitrario (hey, esto es Perl) en lugar de incluirlo como un paquete, 'do' parece ser el camino a seguir. Tal vez no encaja realmente en este contexto; Solo lo recuerdo de esa manera porque _Beginning Perl_ lista 'do' en el capítulo sobre módulos. – musiKk

+0

Si su objetivo es ejecutar un archivo arbitrario, entonces tal vez desee reconsiderar su diseño. – daotoad

Cuestiones relacionadas