Question

Il a été 22 ans entre la sortie publique initiale de Perl 1.0 (18 Décembre, 1987) et la 5.10.1 version stable actuelle (2009).

Au cours de ces 22 années, les versions remarquables 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 - identifiant la version de Perl décrite dans le Livre Camel)
  • Perl 5 (1994 - changements majeurs introduits, près de réécriture complète de l'interprète)
  • Perl 5.6 (2000-64 support 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 intelligent)

Je cherche des exemples précis d'incompatibilités en arrière au cours de 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)?

S'il vous plaît inclure des références et des exemples de code lorsque cela est possible.

Était-ce utile?

La solution

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

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

En Perl 4 qui serait:

foo@example.com

Dans Perl 5 qui serait:

foo1 2 3.com

Heureusement, si le tableau n'existe pas Perl vous avertira « interpolation non intentionnels ».

Threads ont subi un grand changement entre 5,005 et 5,6. « 5005 threads » ont utilisé le modèle traditionnel dans lequel le filetage Posix toutes les données globales sont partagées. Alors qu'en théorie, cela a été plus rapide, car alors Perl pourrait simplement utiliser threads POSIX, il a été un cauchemar pour les codeurs Perl. La plupart des modules Perl ne sont pas thread-safe. Et il n'a jamais vraiment bien fonctionné.

5.6, ActiveState et d'autres ont fait fork () sous Windows. Lorsque vous fork () sous Windows, Perl serait une copie de l'objet interprète et exécuter les opcodes des deux interprètes. Cela était connu comme « multiplicité ».

5.8, Arthur Bergman a couru avec cela et utilisé pour créer ithreads. Parce que la multiplicité émule un processus distinct, aucune donnée est partagée par défaut. Seules les données que vous dites est partagé est partagé. Cela les rend beaucoup plus sûr d'utiliser, mais il a fallu beaucoup de temps avant que les ithreads sont restés stables. Des gens comme Elizabeth Mattijsen et Jerry Hedden fait que cela se produise.

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

Une autre grande incompatibilité entre Unicode est venu wrt 5,6 et 5,8. Unicode 5.6 soufflé. Si oui ou non une chaîne a été Unicode a été décidé par le champ environnant. Il a été entièrement repensée en 5.8 maintenant la Unicodeiness d'une chaîne est liée à la chaîne. Le code écrit en utilisant Unicode de 5,6 devrait généralement être réécrite en 5.8, souvent parce que pour obtenir Unicode 5.6 de travailler à droite vous avez dû faire hacks laid.

Récemment, 5.10.1 a fait un tas de changements incompatibles INTELLIGENTS match. Heureusement, ils ont été introduits dans 5.10.0 si ce ne est pas une grosse affaire. L'histoire il y a Perl 6 a introduit le concept smart-match, et il a été backported à 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 ne dit le Perl 5 gars et il est sorti en 5.10.0 inchangé. Larry Wall a remarqué et a fait l'équivalent d'OMG YER Doin mal !!! La nouvelle version Perl 6 a été considérée comme nettement mieux et 5.10.1 fixé il.

Autres conseils

pseudo-hash sont un exemple récent que printemps à mon esprit. En général, les fichiers perldelta ont un aperçu des changements incompatibles dans une version spécifique. Ces changements sont presque toujours soit obscure (comme pseudo-hash) ou petit.

Oui. Il y a beaucoup, même si elles sont généralement mineures. Parfois, cela est dû à des cycles qui se terminent en fin de compte à l'obsolescence retrait. Parfois, il est dû à l'évolution sémantique de nouvelles (et expérimentales) caractéristiques. Parfois, il est des corrections de bugs pour des choses qui ne fonctionnent pas correctement. Les développeurs Perl prennent grand soin de préserver la rétrocompatibilité entre les versions chaque fois que possible. Je ne me souviens jamais avoir un script qui a été brisé par mise à niveau vers une nouvelle version de Perl.

L'ordre de hachage interne a changé plusieurs fois. Bien que ce n'est pas quelque chose que vous devez dépendre, il peut causer des problèmes si vous le faites sans le savoir.

incompatibilité binaire entre les versions majeures (5.x) est commun, mais habituellement signifie simplement que doivent être recompilé toutes les extensions XS.

La liste complète est beaucoup trop long d'énumérer ici. Vous pouvez l'obtenir en consultant la section « Incompatibilités » de chaque version de historique.

OTOH il y a quelques traits sauvages datant de Perl 1 qui fonctionnent encore. Par exemple, qu'est-ce que cette impression?

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

C'est vrai, 23. Pourquoi? Parce que « tableaux associatifs » ne sont pas des objets de première classe en 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 c'est verruqueuse. Donc, pour la compatibilité avec Perl 1, vous pouvez accéder à un hachage global sans utiliser %, peut-être si votre clavier est cassé ou Apple décide personne qui utilise le symbole de %.

chdir a quelques bizarreries. chdir() sans argument vous amène à votre répertoire, reproduisant le comportement de cd shell. Malheureusement, il en sera chdir undef et chdir "" ce qui rend difficile d'attraper les erreurs autour chdir. Heureusement, ce comportement est dépréciée. Je vais devoir vous assurer qu'il meurt en 5.14.

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

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

Perl 5 a changé pour être scope fichier, sinon il était un frein de performance et une grande source de CrAzY.

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 le pièges Perl pour imprudents:

  

LHS vs. RHS de tout opérateur d'affectation. LHS est évaluée en premier 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 une nouvelle et peut-être des choses incompatibles, voir la FAQ entre Perl4 et Perl5.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top