¿Por qué todos los módulos de Perl 5 tienen que terminar con 1;
?¿Por qué tiene que poner un 1; al final de un módulo Perl 5?
Respuesta
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
he visto ''false';' usado antes como un valor verdadero ... :) – plusplus
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. " –
Esto no responde a la pregunta: _¿por qué debe un módulo terminar con un valor verdadero? – flies
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 HERE
elsif()
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!
- 1. ¿Por qué mi loop de Perl está apagado al final?
- 2. ¿Por qué el 1 al final de cada paquete de Perl?
- 3. Perl: símbolos de exportación de módulo que tiene> 1 paquete
- 4. SQL Server: ¿Por qué debería agregar "; 1" al final de un nombre de procedimiento almacenado?
- 5. ¿Por qué no es [1..5] == [1,2,3,4,5]?
- 6. ¿Qué poner en un módulo de python docstring?
- 7. ¿por qué la directiva #include no tiene un punto y coma al final de la instrucción?
- 8. perl $ | = 1; ¿Que es esto?
- 9. Perl: ¿Por qué no eval '/(...)/' establece $ 1?
- 10. ¿Por qué un punto final de la API XML-RPC lanzará aleatoriamente un ProtocolError -1?
- 11. ¿Por qué un [:] = 1 es fundamentalmente diferente de un [:] = '1'?
- 12. ¿Por qué un C# System.Decimal recuerda los ceros al final?
- 13. ¿Por qué una consulta sql tiene "donde 1 = 1"
- 14. ¿ActiveModel tiene un módulo que incluye un método "update_attributes"?
- 15. ¿Hay un python equivalente al módulo arrancador de perl?
- 16. ¿Cuál es la mejor manera de descubrir todas las subrutinas que tiene un módulo Perl?
- 17. ¿Por qué CheckStyle sugiere que utilizo un método final?
- 18. ¿Qué significa "1" al final de una declaración php print_r?
- 19. ¿Cómo sabe un programa Perl dónde encontrar el archivo que contiene el módulo Perl que utiliza?
- 20. ¿Cómo hacer un método "final" en Perl?
- 21. Perl Inline :: Módulo Python, cómo poner código en una cadena
- 22. ¿Por qué un unsigned int 1 es menor que un char y -1?
- 23. Operador de módulo Perl pregunta
- 24. ¿Hay un módulo Equivlant Perl para el módulo pydbg?
- 25. Llamar a un módulo Perl desde Python
- 26. ¿Por qué 1 .__ add __ (1) produce un error de sintaxis?
- 27. Convención de nomenclatura: ¿Por qué Array # delete no tiene signo de exclamación al final?
- 28. ¿Debo poner .htm al final de mis URL?
- 29. Obtenga un comportamiento de conmutador/caja en Perl 5
- 30. ¿Hay un módulo Perl que funcione de manera similar al comando "which" de Unix?
posible duplicado de [¿Qué hace 1; significa en Perl?] (http: // stackoverflow.com/questions/1940182/what-does-1-mean-in-perl) – daxim