Una delle maggiori incompatibilità intenzionali è l'interpolazione degli array che è cambiata tra Perl 4 e Perl 5.
my @example = qw(1 2 3);
print "[email protected]";
In Perl 4, che sarebbe:
[email protected]
In Perl 5 che sarebbe:
foo1 2 3.com
Fortunatamente, se la matrice non esiste Perl vi avvertirà " possibile interpolazione involontaria ".
I thread hanno subito un grande cambiamento tra 5.005 e 5.6. "5005 thread" utilizzava il modello di threading POSIX tradizionale in cui tutti i dati globali sono condivisi. Mentre in teoria questo era più veloce, perché allora il Perl poteva usare solo i thread POSIX, era un incubo per i programmatori Perl. La maggior parte dei moduli Perl non erano thread-safe. E non ha mai funzionato davvero bene.
In 5.6, ActiveState e altri hanno fatto fork() su Windows. Quando fork() su Windows, Perl crea una copia dell'oggetto interprete ed esegue gli opcode di entrambi gli interpreti. Questo era noto come "molteplicità".
In 5.8, Arthur Bergman ha funzionato con quello e lo ha usato per creare ithreads. Poiché la molteplicità sta emulando un processo separato, nessun dato è condiviso per impostazione predefinita. Solo i dati che dici è condiviso è condiviso. Questo li rende molto più sicuri da usare, anche se ci è voluto molto tempo prima che gli ithreads fossero stabili. Gente come Elizabeth Mattijsen e Jerry Hedden hanno fatto in modo che accadesse.
5005threads sono stati finalmente cancellati in 5.10.0. Esiste un livello di compatibilità, ma dubito che funzionerebbe davvero nel codice di produzione.
Un'altra grande incompatibilità si è avuta con Unicode tra 5.6 e 5.8. Unicode in 5.6 soffiava. Indipendentemente dal fatto che una stringa fosse Unicode è stato deciso dall'ambito circostante. È stato completamente riprogettato in 5.8, quindi ora l'Unicodeiness di una stringa è legato alla stringa. Il codice scritto usando l'Unicode di 5.6 di solito doveva essere riscritto in 5.8, spesso perché per ottenere l'Unicode 5.6 di funzionare correttamente bisognava fare brutti hack.
Recentemente 5.10.1 ha apportato una serie di modifiche incompatibili a smart-match. Fortunatamente sono stati introdotti in 5.10.0 quindi non è un grosso problema. La storia di Perl 6 ha introdotto il concetto di smart-match, ed è stato sostituito con una versione di sviluppo di Perl 5. Il tempo è passato, e l'idea di Perl 6 di smart-matching è cambiata. Nessuno ha detto ai ragazzi di Perl 5 ed è uscito in 5.10.0 invariato. Larry Wall noticed and did the equivalent of OMG YER DOIN IT WRONG!!! La nuova versione di Perl 6 è stata vista come decisamente migliore e quindi 5.10.1 l'ha risolto.
Mi hai battuto. Stavo per dichiarare gli pseudo-hash. :-) –
È solo piccolo se riesci a insegnare a tutti gli sviluppatori della tua azienda a non fare riferimento a campi pseudohash come '$ this -> [$ this -> [0] -> {fieldname}]'. Sigh ... – Ether
Gli pseudo-hash sono sempre stati etichettati come un esperimento. Non è colpa mia se li hai usati nel codice di produzione. : P – Schwern