2012-02-12 23 views

Respuesta

16

use es equivalente a BEGIN { require Module; Module->import(LIST); }

Por lo tanto, la diferencia principal es que:

  • uso se utiliza en tiempo de compilación

  • Uso llama automáticamente subrutina de importación (que pueden hacer nada pero se usa principalmente para exportar identificadores al espacio de nombres de la persona que llama)

  • uso muere si el módulo no puede ser cargado (falta/compilar error)

Como tal:

  • Cuando necesite cargar módulos dinámicamente (por ejemplo, determinar qué módulo para cargar basado en argumentos de línea de comando), use require.

  • En general, cuando se necesita para controlar con precisión cuando se carga un módulo, utilice require (use cargará el derecho módulo después del bloque use o BEGIN precedente, en tiempo de compilación).

  • Cuando se necesita alguna manera de derivación llamando import() subrutina de módulo, utilice require

  • Cuando tenga que hacer algo inteligente en cuanto a errores de manipulación de carga (módulo, el módulo no puede compilar falta), se puede envolver el require en una declaración eval { }, por lo que todo el programa no solo muere.

    Puede simular eso con use pero de una manera más bien elegante (la señal de atrapamiento die en un primer bloque BEGIN debería funcionar). Pero eval { require } es mejor.

  • En todos los demás casos, el uso use

no escondí AUTOLOAD ya que es una bestia diferente. Su uso se da cuando desea interceptar llamadas a subrutinas que no ha importado a su espacio de nombres.

+2

En resumen, generalmente quiere "usar". AUTOLOAD es para interceptar llamadas a métodos no definidos. – djsadinoff

+0

del manual: * Si no desea llamar al método de "importación" del paquete (por ejemplo, para evitar que se altere su espacio de nombres), proporcione explícitamente la lista vacía: * 'use Module();' –

+0

@ Hynek-Pichi -Vychodil: ¿la lista vacía omite llamar a 'import()' o simplemente llama a 'import()' con la lista vacía y, por lo tanto, no da como resultado las importaciones? – DVK

Cuestiones relacionadas