2010-03-23 11 views
24

¿Hay algún servicio similar al codepad que le permita probar construcciones Perl en versiones anteriores de perl?¿Cómo puedo probar cuando se agregó una característica a Perl?

Idealmente, un sistema donde podría ingresar una expresión y le dirá la versión más antigua de perl con la que funcionará.

Por supuesto, es posible usar CPANTS para esto, pero eso parece ser un abuso del servicio (aunque solo sea para hacer que el BackPan sea más grande). Y podría tomar varios días/semanas para obtener una cobertura de prueba decente en las versiones anteriores.

Respuesta

21

Puede que encuentre Perl::MinimumVersion útil. Use la utilidad perlver proporcionada para escanear su código.

+0

+1 Excelente recomendación –

+0

+1 de mí también –

+0

+1 esto es bastante sorprendente! – rjh

3

Sé que perlcritic es capaz de encontrar algunos casos, pero en general deberá buscarlo en google o en archivos perldelta. En particular, es posible que desee ver en los deltas de 5.65.8 y 5.10 y tal vez incluso la próxima 5.12

3

Si lo que buscas es cuando un módulo se introdujo al núcleo de Perl, puede utilizar Module::CoreList.

Si desea ayudar a desarrollar un sistema como codepad para Perl, busque "Pruebas PITA".

Específicamente, si desea que una utilidad descargue e instale una cantidad de binarios Perl para probar su código, puede ver los programas en PITA-Setup-Perl/bin.

+0

Encuentro 'corelist' muy útil, pero desafortunadamente no indica qué * versión * de un módulo se envió con cada distribución de perl. p.ej. Recientemente, estaba haciendo uso de algunas características nuevas en Hash :: Util como se describe en la documentación de perldoc.perl.org, solo para descubrir más tarde que la interfaz que quería utilizar no apareció hasta después de la versión (0.05) que se incluía con la versión de Perl que uso en producción (5.8.5). :( – Ether

+0

Módulo :: CoreList tiene la información de la versión –

8

Creo que si estuviera preocupado, construiría versiones destacadas de Perl en mi máquina y las probaría. En realidad, eso es más o menos lo que hago de todos modos. Mi máquina de Solaris 10 tiene:

lrwxrwxrwx 1 jleffler rd   26 Mar 6 2008 v5.10.0 -> v5.10.0-32bit-multiplicity 
drwxr-xr-x 3 jleffler rd   512 Jan 10 2008 v5.10.0-32bit 
drwxr-xr-x 6 jleffler rd   512 Mar 7 2008 v5.10.0-32bit-multiplicity 
drwxr-xr-x 3 jleffler rd   512 Jan 10 2008 v5.10.0-64bit 
lrwxrwxrwx 1 jleffler rd   13 Jan 29 21:07 v5.10.1 -> v5.10.1-64bit 
drwxr-xr-x 6 jleffler rd   512 Jan 29 21:43 v5.10.1-64bit 
drwxr-xr-x 5 jleffler rd   512 May 6 2003 v5.5.3 
lrwxrwxrwx 1 jleffler RAND   11 Mar 21 2007 v5.6.1 -> v5.6.1-full 
drwxr-xr-x 5 jleffler rd   512 May 6 2003 v5.6.1-full 
drwxr-xr-x 5 jleffler rd   512 Feb 5 2008 v5.8.7-multi 
lrwxrwxrwx 1 jleffler rd   19 Mar 24 2007 v5.8.8 -> v5.8.8-32bit-sun-cc 
drwxr-xr-x 6 jleffler rd   512 Mar 25 2007 v5.8.8-32bit-sun-cc 
drwxr-xr-x 5 jleffler rd   512 Feb 13 2006 v5.8.8-64bit-thread-multi 
drwxr-xr-x 3 jleffler rd   512 Mar 20 2008 v5.8.8-gcc-3.4.6 

Por lo tanto, eso es 5.5.3, 5.6.1, 5.8.7, 5.8.8, 5.10.0 y 5.10.1 instalado; Tengo la fuente para otras versiones también:

-rw-r--r-- 1 jleffler rd  2171936 Apr 12 2001 perl-5.004_04.tar.bz2 
-rw-r--r-- 1 jleffler rd  3023320 Aug 31 1999 perl-5.005_03.tar.bz2 
-rw-r--r-- 1 jleffler rd  12426022 Dec 18 2007 perl-5.10.0.tar.bz2 
-rw-r--r-- 1 jleffler rd  11608061 Jan 29 12:32 perl-5.10.1.tar.bz2 
-rw-r--r-- 1 jleffler rd  4430438 Mar 29 2000 perl-5.6.0.tar.bz2 
-rw-r--r-- 1 jleffler rd  4864306 Apr 8 2001 perl-5.6.1.tar.bz2 
-rw-r--r-- 1 jleffler rd  5142605 Aug 16 2005 perl-5.6.2.tar.bz2 
-rw-r--r-- 1 jleffler rd  8618487 Jul 18 2002 perl-5.8.0.tar.bz2 
-rw------- 1 jleffler rd  9410641 Sep 29 2003 perl-5.8.1.tar.bz2 
-rw-r--r-- 1 jleffler rd  9424944 Nov 5 2003 perl-5.8.2.tar.bz2 
-rw-r--r-- 1 jleffler rd  9509716 Jan 14 2004 perl-5.8.3.tar.bz2 
-rw-r--r-- 1 jleffler rd  9598489 Apr 21 2004 perl-5.8.4.tar.bz2 
-rw-r--r-- 1 jleffler rd  9464689 Jul 19 2004 perl-5.8.5.tar.bz2 
-rw-r--r-- 1 jleffler rd  9693085 Nov 27 2004 perl-5.8.6.tar.bz2 
-rw-r--r-- 1 jleffler rd  9839086 Jun 15 2005 perl-5.8.7.tar.bz2 
-rw-r--r-- 1 jleffler rd  1Feb 13 2006 perl-5.8.8.tar.bz2 
-rw-r--r-- 1 jleffler rd  11121414 Dec 14 2008 perl-5.8.9.tar.bz2 
preguntó

@Ether:

¿Tiene una secuencia de comandos que se desarrollará un módulo en particular, la escritura o la prueba de la unidad contra todas las versiones de la secuencia y cotejar los resultados? Tal utilidad podría ser realmente útil como un CGI chrooted/sandboxed.

No, pero no lo he necesitado. Se trata básicamente de forma trivial, sin embargo:

for perl in /usr/perl/v5.*.? 
do 
    echo $(basename $perl) 
    $perl/bin/perl "[email protected]" 
done 

Básicamente, para cada uno de los directorios en Perl/usr/Perl /, ejecute el Perl desde el directorio bin en el conjunto dado de argumentos. Mire la salida ...

La dificultad está en decidir qué constituye pasar/no. Obviamente, el núcleo del bucle podría ser:

if $perl/bin/perl "[email protected]" >/dev/null 2>&1 
    then echo ok $perl 
    else echo not ok $perl 
    fi 

Eso es ligeramente similar a la salida TAP.Para que sea formalmente equivalente (utilizando bash o Korn):

test=0 
max=$(ls -d /usr/perl/v5.*.? | wc -l | sed 's/ //g') 
echo 1..$max 
for perl in /usr/perl/v5.*.? 
do 
    ((test = test + 1)) 
    if $perl/bin/perl "[email protected]" >/dev/null 2>&1 
    then echo  ok $test - $perl 
    else echo not ok $test - $perl 
    fi 
done 

Aquí está un ejemplo de ejecutarlo:

$ ksh test.perl -e 'exit 0' 
1..6 
ok 1 - /usr/perl/v5.10.0 
ok 2 - /usr/perl/v5.10.1 
ok 3 - /usr/perl/v5.5.3 
ok 4 - /usr/perl/v5.6.1 
ok 5 - /usr/perl/v5.8.8 
not ok 6 - /usr/perl/v5.8.8-gcc-3.4.6 
$ 

que muestra una limitación en scripts de shell y sus instalaciones englobamiento (me gustaría para limitar la 'estrella' a una serie de dígitos). El Perl que falla lo hace porque el directorio bin no contiene una copia de Perl; ¡Necesitaba ahorrar espacio en algún momento! No sería difícil convertir el script de shell en un script de Perl, por supuesto.

+0

¡Esa es una lista impresionante! ejecutará un módulo particular, secuencia de comandos o unidad de prueba contra todas las versiones en secuencia y cotejar los resultados? Tal utilidad podría ser muy útil como un CGI chrooted/sandboxed. – Ether

+2

También vea mi publicación en The Effective Perler: http: // www. effectiveperlprogramming.com/blog/92 –

+0

@brian d foy: Artículo interesante. Empleo un baño sistema equivalente de Sely para Perl, Python, GCC, Tcl/Tk, Git, OpenSSL y (algo aún más extenso) para los productos Informix en los que trabajo tanto como con. Las cosas de Informix son confusas porque también tengo que lidiar con entornos de 32 bits frente a los de 64 bits. –

Cuestiones relacionadas