2014-04-14 22 views
6

sto guardando un po 'di codice, ma non capisco che cosa la seguente riga sta facendo/controllo:Cosa significa questa linea in perl?

return if !%Foo::Details:: ; 

che cosa è esattamente questo facendo? Sta verificando l'esistenza del modulo Foo :: Details?

+3

Sembra un modo davvero scadente per verificare se un modulo è stato caricato nella tabella dei simboli. '% Foo :: Details' è la voce della tabella dei simboli per il pacchetto' Foo :: Details', se non è caricato restituirà false, che se negate restituisce true. Date un'occhiata a ['la sezione della tabella dei simboli di perlmod'] (http://perldoc.perl.org/perlmod.html#Symbol-Tables) –

+0

@HunterMcMillen Penso che sia elegante, basata unicamente sulla sua compattezza. Cosa lo rende esattamente povero? – Jarmund

+1

Non è molto chiaro (in un primo momento) cosa stia facendo questo codice, ecco perché penso che sia * scarso *. Ci sono soluzioni migliori, più leggibili. –

risposta

9

Un hash in contesto scalare restituisce false se è vuoto, quindi il codice restituisce una lista vuota se l'hash %Foo::Details:: è vuoto.

Questo hash è la tabella dei simboli per lo spazio dei nomi Foo::Details. Se una variabile pacchetto o sub viene creata nello spazio dei nomi Foo::Details, verrà creato un glob corrispondente al nome della variabile o del sottotitolo in %Foo::Details::. Quindi, restituisce una lista vuota se lo spazio dei nomi Foo :: Details è vuoto.

$ cat >Foo/Details.pm 
package Foo::Details; 
sub boo { } 
1; 

$ perl -E'say %Foo::Details:: ?1:0;' 
0 

$ perl -E'use Foo::Details; say %Foo::Details:: ?1:0;' 
1 

Potrebbe cercare di verificare se il modulo Foo :: Details è stato caricato, ma non è perfetto. Ad esempio, penserà che Foo :: Details sia stato caricato anche se è stata caricata solo Foo :: Details :: Bar. Per verificare se Foo :: Details è stato caricato, potrebbe essere meglio controllare se $INC{"Foo/Details.pm"} è vero. Il problema con questo approccio è che non troverà "moduli in linea".

3

Questo codice verifica se un modulo è stato caricato o meno. %Foo::Details:: è la tabella dei simboli per il modulo Foo::Details.

Se Foo::Details non è mai stato caricato %Foo::Details:: tornerà falso (perché non contiene elementi), che una volta negato con ! tornerà vera e ritorno da qualsiasi funzione vi trovate.

Si può leggere di più su tabelle dei simboli in perlmod#Symbol Tables

Inoltre, here is another SO post che parla dei modi per determinare se un modulo è stato caricato.

+0

più corretto per dire% Foo :: Dettagli :: * è * la tabella dei simboli per il modulo – ysth

+0

Secondo paragrafo errato. Vedi la mia risposta. – ikegami

+0

Non è tecnicamente una voce? Dal momento che è tenuto in '% main ::'? –