2008-10-08 10 views

risposta

81

use avviene al momento della compilazione, quindi questo dovrebbe funzionare:

BEGIN {push @INC, '..'} 
use EPMS; 

Ma la soluzione migliore è quella use lib, che è un modo migliore di scrivere quanto sopra:

use lib '..'; 
use EPMS; 

In caso si sta eseguendo da una directory diversa, tuttavia, l'uso di FindBin è consigliato:

use FindBin;      # locate this script 
use lib "$FindBin::RealBin/.."; # use the parent directory 
use EPMS; 
+1

Di solito si vuole fare un inshift in modo che la directory sia il fronte della lista. In questo modo Perl non deve cercare tra tutti @INC per trovarlo. :) –

+0

Sì, è vero, e quindi la conversione BEGIN {push} => 'use lib' non è identica. Ma volevo mostrare il minimo cambiamento utilizzabile dalla domanda per farlo funzionare. Grazie per aver notato :) – ephemient

+0

C'è anche PERL5LIB e l'opzione -I, come cita Brian. – Axeman

2

È necessario avere lo push elaborato prima che lo use sia - e use venga elaborato in anticipo. Quindi, ho bisogno di un BEGIN { push @INC, ".."; } per avere una possibilità, credo.

+1

Generalmente si desidera eseguire una disattivazione in modo che la directory sia in cima all'elenco. In questo modo Perl non deve cercare tra tutti @INC per trovarlo. :) –

+0

Sì, anche quello ... Normalmente non uso nomi relativi perché normalmente non eseguo script da una directory fissa, quindi ... –

6

'use lib' è la risposta, come @ephemient menzionato in precedenza. Un'altra opzione è usare require/import invece di use. Significa che il modulo non verrebbe caricato in fase di compilazione, ma in runtime.

Ciò consentirà di modificare @INC come si è tentato lì, oppure è possibile passare richiedere un percorso al file anziché il nome del modulo. Da 'perldoc -f require':

Se ESPR è un bareword, la richiedono assume un'estensione ".pm" e sostituisce '::' con '/' nel nome del file per voi, per rendere più facile a carica moduli standard. Questa forma di caricamento dei moduli non rischia di alterare lo spazio dei nomi con .

19

Esistono diversi modi per modificare @INC.

  • set PERL5LIB, come documentato in perlrun

  • utilizzare l'interruttore -I sulla riga di comando, documentato anche in perlrun. Puoi anche applicarlo automaticamente con PERL5OPT, ma usa PERL5LIB solo se hai intenzione di farlo.

  • use lib all'interno del programma, anche se questo è fragile poiché un'altra persona su una macchina diversa potrebbe averla in una directory diversa.

  • Modificare manualmente @INC, assicurandosi di farlo al momento della compilazione se si desidera utilizzare un modulo. Questo è troppo lavoro però.

11

Personalmente preferisco tenere i miei moduli (quelli che scrivo per me stesso o per sistemi posso controllare) in una determinata directory, e anche di metterli in una sottodirectory. Come in:

/www/modules/MyMods/Foo.pm 
/www/modules/MyMods/Bar.pm 

E poi dove li uso:

use lib qw(/www/modules); 
use MyMods::Foo; 
use MyMods::Bar; 

Per inciso .. quando si tratta di spingere, io preferisco il grasso-freccia virgola:

push @array => $pushee; 

Ma è solo una questione di preferenza.

+2

Questa sintassi di spinta sembra molto confusa. Sta sicuramente indicando la strada sbagliata. Da una prospettiva meccanica. È uguale a una virgola? La virgola è molto più ambigua riguardo la direzione, e quindi meglio ... –

+0

@StevenLu Da ['perldoc perlop'] (http://perldoc.perl.org/perlop.html # Comma-Operator): * "L'operatore' => 'è un sinonimo per la virgola tranne che fa sì che una parola alla sua sinistra venga interpretata come una stringa se inizia con una lettera o underscore e si compone solo di lettere , cifre e caratteri di sottolineatura. [...] Altrimenti, l'operatore '=>' si comporta esattamente come l'operatore virgola o il separatore di argomenti dell'elenco, in base al contesto. "*' => 'è anche noto come" fat comma ". – ThisSuitIsBlackNot

+0

Peccato che lo stesso non valga per '<='. –

1

Come riportato da "perldoc -f uso":

Esso è esattamente equivalente a
BEGIN { require Module; import Module LIST; }
eccetto che il modulo deve essere un bareword.

Mettere che un altro modo, "l'uso" è equivalente a:

  • in esecuzione al momento della compilazione,
  • convertire il nome del pacchetto da un nome di file,
  • require -ing che il nome del file e
  • import -ing quel pacchetto.

Così, invece di chiamare l'uso, è possibile chiamare richiedere e importare all'interno di un blocco BEGIN:

BEGIN { 
    require '../EPMS.pm'; 
    EPMS->import(); 
} 

E, naturalmente, se il modulo non effettivamente fare qualsiasi simbolo di esportazione o altra inizializzazione quando si chiama import, è possibile lasciare questa riga fuori:

BEGIN { 
    require '../EPMS.pm'; 
}