12

Il s'est écoulé 22 ans entre la publication publique initiale de Perl 1.0 (18 décembre 1987) et la version stable actuelle 5.10.1 (2009).Quels sont les exemples spécifiques d'incompatibilité arrière dans les versions de Perl?

Au cours de ces 22 années, les versions notables suivantes ont été faites:

  • Perl 1.0 (1987 - version initiale)
  • Perl 2 (1988 - de meilleures expressions régulières)
  • Perl 3 (1989 - support pour les flux de données binaires)
  • Perl 4 (1991 - identification de la version de Perl décrite dans le Camel Book)
  • Perl 5 (1994 - changements majeurs introduits, réécriture presque complète de l'interpréteur)
  • Perl 5.6 (2000 - prise en charge 64 bits, chaînes unicode, un grand support de fichiers)
  • Perl 5.8 (2002 - amélioration du support unicode, nouvelle implémentation IO)
  • Perl 5.10 (2007 - nouvelle instruction switch, mises à jour régulières d'expression , opérateur de correspondance intelligente)

Je recherche des exemples spécifiques d'incompatibilité arrière dans l'histoire de Perl.

Question:

  • Dans l'histoire de 22 ans de Perl, sont là des exemples de Perl incompatibilité arrière où le code source Perl ciblant la version Perl X ne fonctionne pas sous la version Y (où Y> X) ?

Veuillez inclure des références et des exemples de code si possible.

Répondre

14

L'une des plus grandes incompatibilités délibérées est l'interpolation de tableau qui a changé entre Perl 4 et Perl 5.

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

En Perl 4 qui serait:

[email protected] 

En Perl 5, qui serait:

foo1 2 3.com 

Heureusement, si le tableau n'existe pas Perl vous avertira " interpolation involontaire possible ".

Les fils ont subi un grand changement entre 5.005 et 5.6. "5005 threads" utilisait le modèle de thread POSIX traditionnel où toutes les données globales sont partagées. Alors qu'en théorie c'était plus rapide, parce que Perl pouvait simplement utiliser des threads POSIX, c'était un cauchemar pour les codeurs Perl. La plupart des modules Perl n'étaient pas adaptés aux threads. Et ça n'a jamais vraiment bien marché.

Dans 5.6, ActiveState et d'autres ont créé fork() sous Windows. Quand vous fork() sur Windows, Perl ferait une copie de l'objet interpréteur et exécuterait les opcodes des deux interpréteurs. Ceci était connu comme "multiplicité".

Dans 5.8, Arthur Bergman a couru avec cela et l'a utilisé pour créer ithreads. Comme la multiplicité émule un processus séparé, aucune donnée n'est partagée par défaut. Seules les données que vous dites partagées sont partagées. Cela les rend beaucoup plus sûr à utiliser, mais il a fallu beaucoup de temps avant que les têtes soient stables. Des gens comme Elizabeth Mattijsen et Jerry Hedden y sont parvenus.

5005threads ont finalement été supprimés dans 5.10.0. Une couche de compatibilité existe, mais je doute que cela fonctionne vraiment dans le code de production.

Une autre grosse incompatibilité est venue de l'Unicode entre 5.6 et 5.8. Unicode dans 5.6 soufflé. Si une chaîne était Unicode ou pas était décidé par la portée environnante. Il a été complètement repensé en 5.8, maintenant le caractère Unicode d'une chaîne est lié à la chaîne. Le code écrit à l'aide de Unicode de 5.6 doit généralement être réécrit en 5.8, souvent parce que pour obtenir un Unicode de 5.6, vous devez faire des hacks horribles.

Récemment, 5.10.1 a fait un tas de changements incompatibles à smart-match. Heureusement, ils ont été introduits en 5.10.0, donc ce n'est pas un gros problème. Perl 6 a présenté le concept de smart-match, et il a été rétroporté vers une version de développement de Perl 5. Le temps a passé et l'idée de Perl 6 de l'appariement intelligent a changé. Personne n'a parlé aux gars de Perl 5 et il est sorti en 5.10.0 inchangé. Larry Wall noticed and did the equivalent of OMG YER DOIN IT WRONG!!! La nouvelle version de Perl 6 a été considérée comme nettement meilleure et donc 5.10.1 l'a corrigée.

12

Pseudo-hashes sont un exemple récent qui me vient à l'esprit. En général, perldelta files ont une vue d'ensemble des changements incompatibles dans une version spécifique. Ces changements sont presque toujours soit obscurs (comme des pseudo-hachages) ou petits.

+0

Tu m'as battu dessus. J'étais sur le point d'énoncer des pseudo hachages. :-) –

+0

Ce n'est que petit si vous pouvez apprendre à tous les développeurs de votre entreprise à ne pas référencer les pseudo-champs comme '$ this -> [$ this -> [0] -> {fieldname}]'. Soupir ... – Ether

+6

Les pseudo-hachages ont toujours été étiquetés comme une expérience. Pas ma faute si vous les avez utilisés dans le code de production. : P – Schwern

11

Oui. Ils sont nombreux, bien qu'ils soient généralement mineurs. Parfois, cela est dû au fait que les cycles de dépréciation finissent par se terminer. Parfois, cela est dû à la modification de la sémantique des nouvelles fonctionnalités (et expérimentales). Parfois, ce sont des corrections de bugs pour des choses qui ne fonctionnent pas correctement. Les développeurs de Perl s'efforcent de préserver la rétrocompatibilité entre les versions dans la mesure du possible. Je ne me souviens pas avoir eu un script qui a été cassé en mettant à jour vers une nouvelle version de Perl.

L'ordre de hachage interne a changé plusieurs fois. Bien que ce ne soit pas quelque chose dont vous devriez dépendre, cela peut causer des problèmes si vous le faites involontairement.

Une incompatibilité binaire entre les versions majeures (5.x) est courante, mais cela signifie généralement que toutes les extensions XS doivent être recompilées.

La liste complète est beaucoup trop longue pour être lue ici. Vous pouvez l'obtenir en cochant la section "Changements incompatibles" de la version history de chaque version.

+0

L'ordre de hachage interne est aléatoire dans les versions les plus récentes. –

+0

@Brad Gilbert: Oui et non. La randomisation du hash a été ajoutée en 5.8.1 mais à partir de la version 5.8.2, elle ne se produit que si la distribution des clés est mauvaise. –

5

OTOH il y a quelques caractéristiques sauvages datant de Perl 1 qui fonctionnent encore. Par exemple, qu'est-ce que cela imprime?

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

C'est vrai, 23. Pourquoi? Parce que "tableaux associatifs" n'étaient pas des objets de première classe dans Perl 1. $foo{bar} travaillé mais il n'y avait pas %foo. Je ne sais vraiment pas pourquoi, même la page de manuel Perl 1 reconnaît que c'est warty. Donc pour la compatibilité avec Perl 1 vous pouvez accéder à un hash global sans utiliser un %, peut-être si votre clavier est cassé ou qu'Apple décide que personne n'utilise le symbole %.

chdir a quelques bizarreries. chdir() sans argument vous amène à votre répertoire personnel, répliquant le comportement du shell cd. Malheureusement, il en sera de même pour chdir undef et chdir "", ce qui rend difficile la détection d'erreurs autour de chdir. Heureusement, ce comportement est obsolète. Je vais devoir m'assurer qu'il meurt en 5.14.

$[ est toujours là et reste non déconseillé, mais "fortement déconseillé". Il change ce que le premier indice d'un tableau est, donc si vous êtes un être humain comme moi et compter de 1 vous pouvez faire:

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

Perl 5 a changé pour être scope fichier, sinon il a été traînée de performance et une excellente source de CrAy.

+2

* Hash% foo manquant le% dans l'argument ... * C'est un avertissement que je n'ai jamais vu auparavant. J'aime la description de perldiag: "Vraiment vieux Perl vous laisse omettre le% sur les noms de hachage dans certains endroits, ce qui est maintenant fortement déprécié." Apparemment, il n'est pas assez déprécié pour l'enlever, cependant. –

3

J'ai eu quelques erreurs funky avec Perl4 et Perl5 évaluer la main gauche et la main droite d'une affectation dans un ordre différent, citant les Perl traps for the unwary:

LHS vs. RHS de tout opérateur d'affectation. LHS est évalué d'abord en perl4, deuxième en perl5; Cela peut affecter la relation entre les effets secondaires dans les sous-expressions.

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

Pour des choses nouvelles et peut-être incompatibles, voir the FAQ entre Perl4 et Perl5.