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".
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) –
@HunterMcMillen Penso che sia elegante, basata unicamente sulla sua compattezza. Cosa lo rende esattamente povero? – Jarmund
Non è molto chiaro (in un primo momento) cosa stia facendo questo codice, ecco perché penso che sia * scarso *. Ci sono soluzioni migliori, più leggibili. –