12

Han transcurrido 22 años entre la publicación pública inicial de Perl 1.0 (18 de diciembre de 1987) y la versión estable actual 5.10.1 (2009).¿Cuáles son algunos ejemplos específicos de incompatibilidades regresivas en las versiones de Perl?

Durante esos 22 años las siguientes publicaciones notables se han realizado:

  • Perl 1.0 (1987 - liberación inicial)
  • Perl 2 (1988 - mejores expresiones regulares)
  • Perl 3 (1989 - soporte para flujos de datos binarios)
  • Perl 4 (1991 - identificación de la versión de Perl descrita en el Camel Book)
  • Perl 5 (1994 - cambios importantes introducidos, casi completa reescritura del intérprete)
  • Perl 5.6 (2000 - soporte de 64 bits, cadenas Unicode, Soporte de archivos grandes)
  • Perl 5.8 (2002 - Mejorado el soporte Unicode, nueva implementación IO)
  • Perl 5.10 (2007 - nueva instrucción switch, actualizaciones de expresiones regulares , operador de coincidencia inteligente)

Estoy buscando ejemplos específicos de incompatibilidades hacia atrás durante la historia de Perl.

Pregunta:

  • En los 22 años de historia de Perl, ¿hay algún ejemplo de Perl hacia atrás incompatibilidad donde el código fuente de Perl Perl focalización versión X no se ejecutará bajo la versión de Y (donde Y> X) ?

Por favor, incluya referencias y ejemplos de código cuando sea posible.

Respuesta

14

Una de las mayores incompatibilidades deliberadas es la interpolación de matriz que cambió entre Perl 4 y Perl 5.

my @example = qw(1 2 3); 
print "[email protected]"; 

En Perl 4 que sería:

[email protected] 

En Perl 5 que sería:

foo1 2 3.com 

Afortunadamente, si la matriz no existe Perl le advertirá sobre " posible interpolación involuntaria ".

Los hilos experimentaron un gran cambio entre 5.005 y 5.6. "5005 hilos" utilizaron el modelo tradicional de enhebrado POSIX donde se comparten todos los datos globales. Mientras que en teoría esto era más rápido, porque Perl solo podía usar hilos POSIX, era una pesadilla para los programadores de Perl. La mayoría de los módulos de Perl no eran seguros para subprocesos. Y nunca funcionó bien.

En 5.6, ActiveState y otros hicieron fork() en Windows. Cuando fork() en Windows, Perl haría una copia del objeto del intérprete y ejecutaría los códigos de operación de ambos intérpretes. Esto se conocía como "multiplicidad".

En 5.8, Arthur Bergman corrió con eso y lo usó para crear ithreads. Como la multiplicidad está emulando un proceso separado, no se comparten datos por defecto. Solo se comparten los datos que dices que se comparten. Esto los hace mucho más seguros de usar, aunque transcurrió mucho tiempo antes de que los ithreads estuvieran estables. Gente como Elizabeth Mattijsen y Jerry Hedden hicieron que eso sucediera.

5005 hilos finalmente fueron eliminados en 5.10.0. Existe una capa de compatibilidad, pero dudo que realmente funcione en el código de producción.

Otra gran incompatibilidad se produjo entre Unicode 5.6 y 5.8. Unicode en 5.6 explotó. El alcance circundante decidía si una cadena era Unicode o no. Fue rediseñado por completo en 5.8 por lo que ahora la Unicodeiness de una cadena está ligada a la cadena. El código escrito utilizando Unicode de 5.6 generalmente tenía que ser reescrito en 5.8, a menudo porque para obtener 5.6's Unicode funcionara correctamente, tenía que hacer feos hacks.

Recientemente, 5.10.1 realizó una serie de cambios incompatibles en Smart-Match. Afortunadamente, se introdujeron en 5.10.0, por lo que no es un gran problema. La historia allí es que Perl 6 introdujo el concepto de partido inteligente, y se transfirió a una versión de desarrollo de Perl 5. El tiempo pasó, y la idea de Perl 6 de adaptación inteligente cambió. Nadie le dijo a los chicos de Perl 5 y salió en 5.10.0 sin cambios. Larry Wall noticed and did the equivalent of OMG YER DOIN IT WRONG!!! La nueva versión de Perl 6 se consideró significativamente mejor, por lo que 5.10.1 la solucionó.

12

Pseudo-hashes son un ejemplo reciente que me viene a la mente. En general, perldelta files tiene una visión general de los cambios incompatibles en una versión específica. Estos cambios casi siempre son oscuros (como pseudo-hashes) o pequeños.

+0

Me lo ganaste. Estaba a punto de decir pseudo hash. :-) –

+0

Es muy poco si puedes enseñar a todos los desarrolladores de tu empresa a no hacer referencia a los campos de pseudohash como '$ this -> [$ this -> [0] -> {fieldname}]'. Suspiro ... – Ether

+6

Pseudo-hashes siempre fueron etiquetados como un experimento. No es mi culpa si los usaste en el código de producción. : P – Schwern

11

Sí. Hay muchos, aunque generalmente son menores. Algunas veces esto se debe a ciclos de desaprobación que finalmente terminan en eliminación. A veces se debe a una semántica cambiante para las características nuevas (y experimentales). A veces se trata de corregir errores para cosas que no funcionaron correctamente. Los desarrolladores de Perl hacen grandes esfuerzos para preservar la compatibilidad hacia atrás entre versiones siempre que sea posible. No recuerdo haber tenido un script que se haya roto actualizando a una nueva versión de Perl.

La orden interna de hash ha cambiado varias veces. Si bien esto no es algo de lo que deba depender, puede causar problemas si lo hace involuntariamente.

La incompatibilidad binaria entre versiones principales (5.x) es común, pero eso solo significa que cualquier extensión XS necesita ser recompilada.

La lista completa es demasiado larga para enumerarla aquí. Puede obtenerlo marcando la sección "Cambios incompatibles" de cada versión history.

+0

La "orden de almohadilla" interna se asigna al azar en las versiones más recientes. –

+0

@Brad Gilbert: Sí y no. La aleatorización hash se agregó en 5.8.1 pero a partir de 5.8.2 solo ocurre si la distribución de claves es pobre. –

5

OTOH hay algunas características salvajes que datan de Perl 1 que todavía funcionan. Por ejemplo, ¿qué significa esto?

%foo = (foo => 23); 
print values foo 

Así es, 23. ¿Por qué? Debido a que "matrices asociativas" no eran objetos de primera clase en Perl 1. $foo{bar} funcionaba, pero no había %foo. Realmente no sé por qué, incluso la página de Perl 1 man reconoce que esto es verrugoso. Por lo tanto, para compatibilidad con Perl 1, puede acceder a un hash global sin usar un %, tal vez si su teclado está roto o Apple decide que nadie usa el símbolo %.

chdir tiene algunas rarezas. chdir() sin argumentos lo llevará a su directorio de inicio, replicando el comportamiento de shell cd. Lamentablemente también lo harán chdir undef y chdir "", lo que dificulta la captura de errores alrededor de chdir. Afortunadamente este comportamiento está en desuso. Tendré que asegurarme de que muera en 5.14.

$[ todavía está presente y sigue sin explotar, pero "muy desaconsejado". Cambia lo que el primer índice de una matriz es, así que si usted es un ser humano como yo, y contar de 1 que podía hacer:

$[ = 1; 
@foo = qw(foo bar baz); 
print $foo[2]; # prints bar 

Perl 5 modificaciones que sea el archivo de ámbito, como por lo demás era una arrastre de rendimiento y una gran fuente de CrAzY.

+2

* Hash% foo falta el% en la discusión ... * Esa es una advertencia que nunca he visto antes. Me gusta la descripción de Perldiag: "Realmente el viejo Perl te permite omitir el% en los nombres hash en algunos lugares. Esto ahora está muy obsoleto". Aparentemente, no está en desuso lo suficiente como para realmente eliminarlo. –

3

he tenido algunos errores funky con Perl4 y Perl5 evaluación de la mano izquierda y laterales a derecha de una asignación en un orden diferente, citando las Perl traps for the unwary:

LHS RHS frente de cualquier operador de asignación. LHS se evalúa primero en perl4, segundo en perl5; esto puede afectar la relación entre los efectos secundarios en las subexpresiones.

@arr = ('left', 'right'); 
$a{shift @arr} = shift @arr; 
print join(' ', keys %a); 
# perl4 prints: left 
# perl5 prints: right 

Para algunas cosas nuevas y posiblemente incompatibles, consulte the FAQ entre Perl4 y Perl5.

Cuestiones relacionadas