2010-09-03 10 views
20

Acabo de darme cuenta de esto generado por Catalyst.pl. Obviamente es una especie de hack no anotado. ¿Cuál es la ventaja de configurar una cadena de versión como esta? Ni siquiera puedo descubrir lo que están tratando de hacer.Cadena de versión Perl: ¿por qué usar EVAL EXPR?

our $VERSION = '0.01'; 
$VERSION = eval $VERSION; 

Respuesta

25

Los números de versión son complejos en Perl. Here's an excellent overview para aquellos que buscan los detalles sangrientos. Tal vez te sorprenda la cantidad de maneras sutiles que hay para conseguir cosas mal ...

La respuesta directa a su pregunta, sin embargo, es que las diferentes cosas esperan diferentes formatos. Para CPAN, le importan las versiones de desarrollo, por ejemplo, como una cadena. Para el tiempo de ejecución, te preocupas por ellos como un número.

Consideremos el caso de $VERSION = "0.01_001". eval lo convierte al número 0.01001 correctamente.

+1

Dios mío, no tenía idea de que las versiones perl fueran tan horribles. +1 para el gran artículo. –

+0

Gracias por ese enlace, esa es una de las mejores publicaciones del blog de Perl que he leído. Eso realmente explica bien este problema (pero pide una actualización de las variantes 'version.pm'). –

5

I se pueden misremembering esto, pero creo que algunos programas de análisis de código automatizadas como para ver la línea de código:

our $VERSION = '0.01'; 

Pero lo que realmente quieren $ VERSIÓN para mantener un flotador en lugar de una cadena.

Es posible que desee leer this article, sé que voy a.

Oh, Dios mío, ahora recuerdo por qué uso

our $VERSION = 20100903; 

números de versión estilo. Eso es una locura Amo a Perl, pero eso es locura pura, refinada y concentrada. No intentaré resumir el artículo de David Golden. Solo tienes que leerlo y llorar.

+2

Los números de versión ocupan los 3 primeros lugares para mí al responder "¿Cuáles son las 5 cosas que odias de tu lenguaje de programación favorito?". – szbalint

+0

@szbalint: Eso parecería un top 5 bastante mal pensado entonces. –

6

El eval convierte la cadena "0.001_001" en un número, siguiendo las reglas para los literales numéricos de Perl (que permiten subrayar la legibilidad). El resultado es el número 0.001001.

Sin la eval, la cadena se convierte a un número siguiendo la regla para las cadenas de conversión, que se detiene en el primer carácter no numérico.

Ej: perl -e 'print "0.001_001" + 0'

12

De perlmodstyle: Version numbering

Si desea lanzar una 'beta' o versión 'alfa' de un módulo, pero no lo hace quieren CPAN.pm a la lista como el más reciente usa un '_' después del número de versión normal seguido de al menos 2 dígitos, por ej. 1.20_01. Si hace esto, se recomienda la siguiente expresión :

  1. $ VERSION = "1.12_01" ;
  2. $ XS_VERSION = VERSIÓN $; # sólo es necesario si tiene código XS
  3. $ VERSION = eval $ VERSIÓN;

Con ese truco MakeMaker será solamente leer la primera línea y por lo tanto leer la subrayado, mientras que el intérprete de perl evaluará el $ VERSION y convertir la cadena en un número. Más tarde operaciones que tratan $ VERSIÓN como un número entonces será capaz de hacerlo sin provocar una advertencia sobre $ VERSION no siendo un número.

Cuestiones relacionadas