2012-02-12 22 views

Odpowiedz

16

use jest równoważna BEGIN { require Module; Module->import(LIST); }

Tak, główną różnicą jest to, że:

  • użycie jest używany w czasie kompilacji

  • Wykorzystanie automatycznie wywołuje podprogram importu (co może zrobić niczego ale najczęściej używane do eksportowania identyfikatorów do przestrzeni nazw rozmówcy)

  • użycie umrze, jeśli moduł nie może być załadowany (brak/błąd kompilacji)

jako takie:

  • Kiedy trzeba załadować moduły dynamicznie (na przykład określić, które moduł do ładowania na podstawie argumentów wiersza poleceń), użyj require.

  • W ogóle, kiedy trzeba dokładnie kontrolować, gdy moduł jest załadowany, należy require (use będzie załadować odpowiedni moduł po poprzednim use lub BEGIN bloku w czasie kompilacji).

  • Kiedy trzeba jakoś bypass wywołanie modułu import() podprogram, należy require

  • Kiedy trzeba zrobić coś inteligentnego miarę obsługi błędów obciążenie (moduł, moduł nie można skompilować brakuje), można owinąć require w oświadczeniu, więc cały program nie tylko umiera.

    Można to zasymulować za pomocą use, ale w raczej elegancki sposób (blokowanie sygnału die we wczesnym bloku die powinno działać). Ale eval { require } jest lepszy.

  • We wszystkich innych przypadkach należy użyć use

nie pokrywają autoLoad jak to już zupełnie inna bestia. Jego użycie ma miejsce w przypadku, gdy chcesz łączyć wywołania podprocedur, które nie zostały zaimportowane do twojej przestrzeni nazw.

+2

Krótko mówiąc, ogólnie chcesz "używać". AUTOLOAD służy do wywoływania wywołań niezdefiniowanych metod. – djsadinoff

+0

Od instrukcji: * Jeśli nie chcesz wywoływać metody "importu" pakietu (na przykład, aby przerwać zmianę przestrzeni nazw), jawnie podaj pustą listę: * 'użyj modułu();' –

+0

@ Hynek-Pichi -Vychodil - czy pusta lista pomija wywołanie 'import()' lub po prostu wywołuje 'import()' z pustą listą, a zatem nie powoduje importu? – DVK

Powiązane problemy