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.
Tu m'as battu dessus. J'étais sur le point d'énoncer des pseudo hachages. :-) –
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
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