metacpan - ¿Cuáles son los valores de retorno válidos del módulo Perl?
perl cpan (6)
Creo que (1) no hay ningún problema con la devolución de un valor verdadero arbitrario de su módulo, pero (2) hay un gran problema con el código oscuro y demasiado inteligente que sugiere para explotar los detalles de la implementación del módulo. No hagas eso
La práctica común en Perl es, por supuesto, finalizar los módulos con 1;
para que una llamada a requerir pueda ser verificada para el éxito. ¿Hay alguna razón por la que el valor de retorno no pueda ser otro valor verdadero? En mis pruebas, no causa problemas, pero me gustaría saber si alguien se ha encontrado con algún problema (como algunos otros módulos o pragmas o cualquier cosa que espere que el valor sea 1
y no solo verdadero) .
Edición: según la opinión popular, y dado que solo funcionará una vez (buen consejo), el código de ejemplo desaparece. Parece que el consenso es que es seguro devolver cualquier valor verdadero, pero nunca confiar en ese valor en el código de llamada, ya que require
devolverá 1
después de la primera carga
Cualquier cosa es un valor de retorno válido. Si desea que la necesidad tenga éxito, debe ser un verdadero valor. Si no desea que la require
satisfactoria (por ejemplo, plataforma no compatible, biblioteca faltante), use un valor falso.
Para ver lo que otras personas han usado como valores de retorno, consulte Acme::ReturnValue .
La gente no espera usar el valor de retorno para nada, por lo que no confundiría a las personas al tratar de hacer eso, no importa lo inteligente que parezca en ese momento. :)
El propósito es que si su módulo devuelve falso, el requerimiento puede fallar en ese punto. A nadie le importa o confía en que el valor que está más allá de ser verdadero o falso.
Deberías seguir su ejemplo. Lo está haciendo para que sus módulos dependan del valor real más allá de si es verdadero o falso. En el ejemplo que dio, por ejemplo, si su requerimiento devuelve 1
, el requerimiento tendrá éxito, pero su constructor inteligente fallará.
He estado poniendo cosas tontas al final de mis módulos por un tiempo. No hay daño y es un pequeño huevo de Pascua. uny2k útilmente termina con "Yes, this code is a joke."
Class::Fields están llenos de ellos.
Yendo un paso más allá, a veces cuando se documenta una función para devolver true
y false
, devolveré algo distinto de 1 para true
. Esto es para castigar a las personas que escriben if foo() == 1
cuando quieren decir if foo()
. Esto fue aproximadamente en el mismo período en el que escribí, use constant TRUE => 1==1; use constant FALSE => !TRUE;
use constant TRUE => 1==1; use constant FALSE => !TRUE;
He visto el valor de retorno de un módulo utilizado en el código de producción. No recuerdo exactamente por qué. La lógica del desarrollador fue ... torturada. Creo que fue algo así como no querer tener que escribir solo una línea en lugar de dos. No recuerdo por qué no se limitó a exportarlo.
Este fue el mismo desarrollador que usó %_
para pasar argumentos (el símbolo *_
es global en todos los paquetes ) y escribió 150 declaraciones de mapa de línea dentro de las declaraciones de mapa.
El peligro de utilizar el valor de retorno, aparte de la ofuscación, es que solo funciona una vez.
$ cat Foo.pm
package Foo;
return "Basset hounds got long ears";
$ cat test.plx
#!/usr/bin/perl -w
print require Foo, "/n";
print require Foo, "/n";
$ perl -I. test.plx
Basset hounds got long ears
1
La primera llamada a require
evalúa Foo.pm y devuelve el valor de retorno. La segunda llamada ve que ya está en %INC
y simplemente devuelve true. Y ni siquiera puede estar seguro de que es lo primero que necesita el código. Puede do "Foo.pm"
esto con do "Foo.pm"
pero ahora está recargando el módulo cada vez con advertencias sobre rutinas redefinidas, problemas de rendimiento y, posiblemente, reinicialización global. Que no vale la pena.
Una cosa con la que se encontrará es que solo se devuelve el valor de retorno del módulo la primera vez que se carga el módulo. Si el módulo ya estaba cargado, requiera devoluciones 1 sin volver a cargar el módulo.
La sentencia do file
volverá a cargar el archivo cada vez y devolverá el valor de retorno del archivo cada vez. Lo he usado para almacenar datos de configuración en un archivo en forma de un hash anónimo.
Mark Dominus , autor de Higher-Order Perl , explica mi favorito:
Rara vez he usado
$flag = ''Cogito ergo sum'';
que, como todos saben, es evidentemente cierto en todos los universos posibles. Esto asegura la máxima portabilidad.