Pregunta

Ha sido 22 años entre la liberación pública inicial de Perl 1.0 (18 de diciembre, 1987) y la corriente 5.10.1 versión estable (2009).

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

  • Perl 1.0 (1987 - liberación inicial)
  • Perl 2 (1988 - mejores expresiones regulares)
  • Perl 3 (1989 - apoyo para los flujos de datos binarios)
  • Perl 4 (1991 - que identifica la versión de Perl describe en el Libro Camel)
  • Perl 5 (1994 - cambios importantes introducidos, cerca de reescritura completa 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 aplicación IO)
  • Perl 5.10 (2007 - nueva instrucción switch, actualizaciones de expresiones regulares, operador partido 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 ejemplos de Perl hacia atrás incompatibilidad donde el código fuente Perl orientación Perl versión X no se ejecutará bajo la versión Y (donde Y> X)?

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

¿Fue útil?

Solución

Uno de los mayores incompatibilidades deliberada es array interpolación que cambió entre Perl 4 y Perl 5.

my @example = qw(1 2 3);
print "foo@example.com";

En Perl 4 que sería:

foo@example.com

En Perl 5 que sería:

foo1 2 3.com

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

Hilos sometieron a un gran cambio entre 5,005 y 5,6. "5005 hilos" utilizaron el modelo de hilos POSIX tradicional donde se comparte todos los datos mundial. Aunque en teoría esto era más rápido, porque entonces podría Perl sólo tiene que utilizar los hilos POSIX, que era una pesadilla para los programadores de Perl. La mayoría de los módulos de Perl no eran thread-safe. Y en realidad nunca funcionó bien.

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

5,8, Arthur Bergman corrieron con eso y lo utilizaron para crear iThreads. Debido a la multiplicidad está emulando un proceso separado, los datos no se comparten de forma predeterminada. Sólo los datos que usted dice es compartido se comparte. Esto los hace mucho más seguro de usar, aunque tardó un largo tiempo antes de iThreads se mantuvieron estables. La gente como Elizabeth Mattijsen y Jerry Hedden hacen que esto suceda.

5005threads finalmente fueron borrados en 5.10.0. Existe una capa de compatibilidad, pero dudo que sería realmente trabajar en el código de producción.

Otra gran incompatibilidad vino WRT Unicode entre 5,6 y 5,8. Unicode 5.6 en sopló. Sea o no una cadena Unicode se ha decidido por el alcance de los alrededores. Fue completamente rediseñado en el 5,8 por lo que ahora el Unicodeiness de una cadena está ligado a la cadena. El código escrito usando de 5,6 Unicode por lo general tenía que ser reescrito en 5.8, a menudo porque para llegar de 5.6 Unicode funcione bien que tenía que hacer cortes feos.

Recientemente, 5.10.1 hecho un montón de cambios incompatibles a Smart-partido. Por suerte, se introdujeron en 5.10.0 así que no es un gran problema. La historia no es Perl 6 introduce el concepto smart-partido, y fue portado a una versión de desarrollo de Perl 5. El tiempo pasó, y la idea de Perl 6 de smart-juego cambió. Nadie le dijo al Perl 5 chicos y salió en 5.10.0 sin cambios. href="http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2008-01/msg00094.html" Larry Wall se dio cuenta y lo hizo el equivalente de OMG YER doin MAL !!! La nueva versión de Perl 6 fue visto como significativamente mejor y así 5.10.1 fijado a él.

Otros consejos

Pseudo-hashes son un ejemplo reciente que vienen a mi mente. En general, perldelta archivos tienen una visión general de los cambios incompatibles en una versión específica. Estos cambios casi siempre ya sea oscura (como pseudo-hashes) o pequeño.

Sí. Hay muchos, aunque son generalmente de menor importancia. A veces esto es debido a los ciclos de obsolescencia en última instancia, terminan en la eliminación. A veces es debido al cambio de la semántica para los nuevos (y experimental) características. A veces es más correcciones de errores para cosas que no funcionaban correctamente. Los desarrolladores de Perl hacen grandes esfuerzos para preservar la compatibilidad entre versiones siempre que sea posible. No recuerdo haber tenido un guión que fue roto por la actualización a una nueva versión de Perl.

El orden hash interna ha cambiado varias veces. Si bien esto no es algo que debe depender, puede causar problemas si haces sin querer.

incompatibilidad binaria entre las versiones principales (5.x) es común, pero que por lo general sólo significa que cualquier extensión XS necesitan volver a compilar.

La lista completa es demasiado largo enumerar aquí. Se puede conseguir mediante la comprobación de la sección "Cambios incompatible" de cada versión de historia .

otoh hay algunas características salvajes que datan de Perl 1 que aún funciona. Por ejemplo, lo que hace esta impresión?

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

Así es, 23. ¿Por qué? Debido a que "arrays asociativos" no eran objetos de primera clase en Perl 1. $foo{bar} trabajó pero no había %foo. Realmente no sé por qué, incluso la página de manual de Perl 1 reconoce que esto es verrugosa. Así que para la compatibilidad con Perl 1 se puede acceder a un hash mundial sin utilizar un %, tal vez si el teclado está roto o Apple decide nadie utiliza el símbolo %.

chdir tiene algunas rarezas. chdir() sin argumentos le llevará a su directorio, replicando el comportamiento cáscara cd. Desafortunadamente lo que se chdir undef y chdir "" por lo que es difícil de detectar errores en torno chdir. Afortunadamente este comportamiento está en desuso. Voy a tener que asegurarse de que muere en 5.14.

$[ todavía se vende y se mantiene undeprecated, pero "nada recomendable". 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 cambió archivo que sea de ámbito, como por lo demás era un lastre para el rendimiento y una gran fuente de loco.

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 el Perl trampas para el incauto :

  

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

@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 la FAQ entre Perl4 y Perl5.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top