2012-02-12 10 views

risposta

16

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

Quindi, la differenza principale è che:

  • Usa è utilizzato al momento della compilazione

  • Usa chiama automaticamente subroutine di importazione (che può fare nulla ma principalmente utilizzato per esportare identificatori nello spazio dei nomi del chiamante)

  • uso muore se il modulo non può essere caricato (mancanti/errore di compilazione)

Come tale:

  • Quando è necessario caricare moduli dinamicamente (ad esempio, determinare quale modulo da caricare in base agli argomenti della riga di comando), utilizzare require.

  • In generale, quando è necessario controllare con precisione quando viene caricato un modulo, utilizzare require (use caricherà destra modulo dopo il precedente use o BEGIN blocco, al momento della compilazione).

  • Quando avete bisogno in qualche modo di bypass chiamando import() subroutine del modulo, utilizzare per require

  • Quando avete bisogno di fare qualcosa di intelligente per quanto riguarda la gestione degli errori di carico (manca il modulo, modulo non può compilare), si può avvolgere il require in una dichiarazione eval { }, quindi l'intero programma non solo muore.

    È possibile simularlo con use ma in modi piuttosto eleganti (il blocco del segnale die nel primo BEGIN dovrebbe funzionare). Ma eval { require } è meglio.

  • In tutti i casi diversi, utilizzare use

non ho coprire AUTOLOAD come questa è una bestia diversa. Il suo utilizzo è nei casi in cui si desidera intercettare le chiamate alle subroutine che non sono state importate nello spazio dei nomi.

+2

In breve, generalmente si desidera "utilizzare". AUTOLOAD serve per intercettare le chiamate a metodi non definiti. – djsadinoff

+0

Dal manuale: * Se non si desidera chiamare il metodo "import" del pacchetto (ad esempio, per impedire che il proprio spazio dei nomi venga modificato), fornire esplicitamente la lista vuota: * 'use Module();' –

+0

@ Hynek-Pichi -Vychodil - fa la lista vuota salta chiamata 'import()' o chiama semplicemente 'import()' con la lista vuota e quindi non risulta nelle importazioni? – DVK

Problemi correlati