2010-08-31 16 views

Respuesta

23

Un módulo de Perl debe terminar con un valor verdadero o de lo contrario se considera que no se ha cargado . Por convención, este valor suele ser 1 aunque puede ser cualquier valor verdadero. Un módulo puede terminar con falso para indicar la falla pero esto se usa raramente y en su lugar morirá() (saldrá con un error).

fuente: wiki

+6

he visto ''false';' usado antes como un valor verdadero ... :) – plusplus

+1

Dominus una vez [bromeó] (http://groups.google.com/group/comp.lang.perl.misc/msg/a95715144dccec82?hl=en), "Muy pocas veces he usado ... [' 'Cogito ergo sum'; '] (http: // perl. plover.com/qotw/misc/r006/TestExpand.pm) que, como todos saben, es evidentemente cierto en todos los universos posibles. Esto garantiza la máxima portabilidad. " –

+0

Esto no responde a la pregunta: _¿por qué debe un módulo terminar con un valor verdadero? – flies

7

Eso es porque use Module LIST; es equivalente a BEGIN { require Module; Module->import(LIST); } (ver perldoc -f use)

Particularmente, require Module; se pueden implementar con el siguiente fragmento de código (de perldoc -f require):

sub require { 
    my ($filename) = @_; 
    if (exists $INC{$filename}) { 
    return 1 if $INC{$filename}; 
    die "Compilation failed in require"; 
    } 
    my ($realfilename,$result); 
    ITER: { 
    foreach $prefix (@INC) { 
     $realfilename = "$prefix/$filename"; 
     if (-f $realfilename) { 
     $INC{$filename} = $realfilename; 
     $result = do $realfilename; ## HERE 
     last ITER; 
     } 
    } 
    die "Can't find $filename in \@INC"; 
    } 
    if ([email protected]) { 
    $INC{$filename} = undef; 
    die [email protected]; 
    } elsif (!$result) { ## AND HERE 
    delete $INC{$filename}; 
    die "$filename did not return true value"; 
    } else { 
    return $result; 
    } 
} 

¿Ves eso do $realfilename? Mira perldoc -f do, y verás que es el equivalente, más o menos, de eval system("cat $realfilename"), que básicamente significa sorber el archivo y evaluarlo.

En cuanto a los rendimientos perldoc -f eval: "En ambas formas, el valor devuelto es el valor de la última expresión evaluada dentro de la mini-programa de". Es decir, la última declaración en el archivo.

Vale la pena mencionar que si el último "afirmación" es una declaración de subrutina, que no constituye un verdadero valor:

$ perl -le'$r = eval "sub a {1}"; print $r ? "true" : "false"' 
false 

Mientras que un 1; después de que hace:

$ perl -le'$r = eval "sub a {1} 1"; print $r ? "true" : "false"' 
true 

Buscando de nuevo en el sub require anterior, y con el conocimiento de lo que hace require y do, el $result que devuelve el do $realfilename es de hecho el último enunciado eval ed desde el archivo, que es de hecho la última declaración en el archivo.

Si tales última afirmación no es un valor verdadero, el ## AND HEREelsif() destaqué se llamaría, y el require morirían como el módulo no devuelve un valor verdadero. El use Module también moriría, ya que está haciendo un require detrás de escena.

En resumen, no importa con qué termine el archivo, siempre que sea un valor que se entiende como true por perl. Las muestras en la naturaleza (CPAN) incluyen 1;, aunque algunos de estos días terminan en sus archivos en 1 (no falta el punto y coma), y otros simplemente usan cosas como '0 but true'; o 'supercalifragilisticexpiralidous';, todos los cuales son analizados como valores "truish" por Perl.

Esperamos que la anterior es a su satisfacción;)

feliz piratería!

Cuestiones relacionadas