2010-07-21 14 views
6

Algunas de las nuevas características de Perl 5.10 y 5.12, como "decir", se definen como características, que puede habilitar o rechazar explícitamente utilizando el pragma "característica". Pero otras adiciones, como los grupos de captura nombrados de expresiones regulares, están implícitas.¿Puedo asegurarme de que el código de Perl escrito en 5.10+ se ejecutará en 5.8?

Cuando escribo Perl usando un intérprete 5.10+, pero quiero que también se ejecute en 5.8, ¿puedo hacer que Perl se queje de usar algo que no está en 5.8? Obviamente, es una buena práctica probar tu código en todas las versiones principales en las que piensas ejecutar, pero aún así sería bueno que Perl me advierta automáticamente.

+2

Vea también: http://stackoverflow.com/questions/2500892/how-can-i-test-when-a-feature-was-added-to-perl – mob

Respuesta

8

Cuando deseo asegurarme de que un programa se ejecutará en versiones particulares de perl, lo pruebo bajo esa versión de perl. Una característica de mi aplicación release prueba bajo múltiples perls antes de que realmente se cargue.

Esto requiere que tenga un conjunto de pruebas adecuado y que escriba suficientes pruebas. Es fácil mantener varias instalaciones de perl por separado al mismo tiempo, como lo muestro en Programación eficaz Perl.

Test::MinimumVersion casi parece que podría funcionar, pero tiene varias limitaciones. Solo mira el archivo que le das (por lo que no verificará nada que cargues), y no creo que realmente se vea dentro de los patrones de expresiones regulares. Cada uno de éstos informan que la versión mínima es de 5.004, lo que no es cierto para cualquiera de ellos:

#!perl 

use Perl::MinimumVersion; 

my $p_flag = <<'SOURCE'; 
'123' =~ m/[123]/p; # 5.10 feature 
SOURCE 

my $named_capture = <<'SOURCE'; 
'123' =~ m/(?<num>[123])/; # 5.10 feature 
SOURCE 

my $r_line_ending = <<'SOURCE'; 
'123' =~ m/[123]\R/p; # 5.12 feature 
SOURCE 

my $say = <<'SOURCE'; 
say 'Hello'; 
SOURCE 

my $smart_match = <<'SOURCE'; 
$boolean = '123' ~~ @array; 
SOURCE 

my $given = <<'SOURCE'; 
given($foo) { 
    when(/123/) { say 'Hello' } 
    }; 

SOURCE 

foreach my $source ($p_flag, $named_capture, $r_line_ending, $say, $smart_match, $given) { 
    print "----Source---\n$source\n-----"; 
    my $version = Perl::MinimumVersion->new(\$source )->minimum_version; 
    print "Min version is $version\n"; 
    } 

Parte de la razón Perl::MinimumVersion funciona es porque busca indicios de que la fuente da ya, como use 5.010, y use feature etc. Sin embargo, esa no es la única forma de habilitar funciones. Y, como notará, omite elementos como la bandera /p, al menos hasta que alguien agregue un cheque para eso. Sin embargo, siempre estará persiguiendo cosas así con una solución PPI.

Es más fácil compilarlo, ejecutar las pruebas y averiguarlo.

+0

Gracias por la increíblemente profunda respuesta (como de costumbre). Nuestro problema es, como tantas otras veces, toneladas de código antiguo sin pruebas. Sin embargo, veo que tu respuesta es la correcta, aceptada. –

+0

"say" puede ser agregado por Perl6 :: Say 9 (yo mismo lo utilizo cuando estoy en 5.8.8) - entonces no planeo agregar cheque para esto en Perl :: MinimumVersion. Las expresiones regulares son demasiado difíciles de agregar, pero se deben agregar "dado" y "cuándo". –

+0

Debo señalar que el problema no es realmente con Perl :: MinimumVersion, sino con la idea del análisis estático en Perl. PPI es maravilloso, pero nuestra capacidad de entender lo que analiza es fundamentalmente problemático porque Perl es especial. :) –

4

No creo que pueda hacer que Perl compruebe mientras ejecuta el código, pero echa un vistazo a Perl::MinimumVersion y Test::MinimumVersion. (Este último es simplemente un contenedor Test::Builder alrededor del primero.)

+0

¿Tiene algo que esto funciona? No creo que sea de ayuda. –

+0

Bueno, nunca lo intenté yo mismo, pero este es el problema que está intentando resolver. Lo bien que lo resuelve es otra pregunta. – cjm

1

Bueno después de leer otras respuestas su respuesta es no, pero quizás App::perlbrew puede ayudarle a instalar y administrar múltiples versiones de perl para probar.

Cuestiones relacionadas