Domanda

E 'stato 22 anni tra il rilascio pubblico iniziale di Perl 1.0 (18 dicembre 1987) e l'attuale versione stabile 5.10.1 (2009).

In questi 22 anni sono state fatte le seguenti versioni di rilievo:

  • Perl 1.0 (1987 - versione iniziale)
  • Perl 2 (1988 - migliori espressioni regolari)
  • Perl 3 (1989 - il supporto per flussi di dati binari)
  • Perl 4 (1991 - identifica la versione di Perl descritto nel Camel Book)
  • Perl 5 (1994 - modifiche sostanziali introdotte, quasi completa riscrittura del interprete)
  • Perl 5.6 (2000 - supporto a 64 bit, stringhe Unicode, supporto di file di grandi dimensioni)
  • Perl 5.8 (2002 - migliorato il supporto unicode, nuova implementazione IO)
  • Perl 5.10 (2007 - nuova istruzione switch, aggiornamenti espressioni regolari, operatore partita intelligente)

sto cercando esempi specifici di incompatibilità indietro durante la storia di Perl.

Domanda:

  • In 22 anni di storia del Perl, ci sono esempi di Perl indietro incompatibilità quando Perl codice sorgente mira Perl versione X non verrà eseguito con la versione Y (dove Y> X)?

Si prega di inserire i riferimenti ed esempi di codice, quando possibile.

È stato utile?

Soluzione

Uno dei maggiori incompatibilità deliberate è matrice di interpolazione che è cambiato tra Perl 4 e Perl 5.

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

In Perl 4, che sarebbe:

foo@example.com

In Perl 5, che sarebbe:

foo1 2 3.com

Per fortuna, se la matrice non esiste Perl vi avvertirà di "possibili interpolazione non intenzionale".

Le discussioni hanno subito un grande cambiamento tra il 5.005 e 5.6. "5005 discussioni" utilizzato il modello di threading tradizionale POSIX in cui tutti i dati globali è condivisa. Se in teoria questo è stato più veloce, perché allora il Perl potrebbe utilizzare thread POSIX, è stato un incubo per programmatori Perl. La maggior parte dei moduli Perl non erano thread-safe. E non è mai veramente funzionato bene.

In 5.6, ActiveState e altri fatti fork () su Windows. Quando si fork () su Windows, Perl farebbe una copia dell'oggetto interprete ed eseguire i codici operativi delle due interpreti. Questo era noto come "molteplicità".

In 5.8, Arthur Bergman corse con quello e lo ha usato per creare ithread. Perché molteplicità sta emulando un processo separato, senza i dati sono condivisi per impostazione predefinita. Solo i dati che dici è condivisa è condivisa. Questo li rende molto più sicuro da usare, anche se c'è voluto molto tempo prima ithread erano stabili. Gente come Elizabeth Mattijsen e Jerry Hedden fatto che questo accada.

5005threads furono finalmente espunte in 5.10.0. Esiste un livello di compatibilità, ma dubito che sarebbe davvero lavorare nel codice di produzione.

Un altro grande incompatibilità venuto WRT Unicode tra 5.6 e 5.8. Unicode 5.6 soffiò. O meno di una stringa è stata Unicode è stato deciso dal l'ambito circostante. È stato completamente riprogettato nel 5,8 così ora l'Unicodeiness di una stringa è legata alla stringa. Il codice scritto utilizzando 5.6 di Unicode di solito ha dovuto essere riscritto in 5.8, spesso a causa di ottenere 5.6 di Unicode funzionare bene quello che doveva fare brutte hack.

Di recente, 5.10.1 fatto un sacco di cambiamenti incompatibili per smart-partita. Fortunatamente sono stati introdotti in 5.10.0, quindi non è un grande affare. La storia c'è Perl 6 ha introdotto il concetto di smart-match, ed è stato backport a una versione di sviluppo di Perl 5. Il tempo passava, e l'idea di Perl 6 di smart-corrispondenza cambiato. Nessuno ha detto al Perl 5 ragazzi ed è andato in 5.10.0 invariato. Larry Wall notato e ha fatto l'equivalente di OMG YER Doin sbagliato !!! La nuova versione di Perl 6 è stato visto come significativamente migliore e così 5.10.1 riparato.

Altri suggerimenti

Pseudo-hash sono un esempio recente che balzano alla mente. In generale, perldelta file hanno una panoramica dei cambiamenti incompatibili in una versione specifica. Questi cambiamenti quasi sempre o oscura (come pseudo-hash) o piccole.

Sì. Ci sono molti, anche se sono di solito minore. A volte questo è dovuto a cicli deprecazione infine terminano in rimozione. A volte è a causa di cambiare la semantica per i nuovi (e sperimentali) caratteristiche. A volte è correzioni di bug per le cose che non hanno funzionato correttamente. Gli sviluppatori Perl prendono grandi dolori per preservare la compatibilità tra le versioni per quanto possibile. Non riesco a ricordare mai avere uno script che è stato rotto con l'aggiornamento a una nuova versione di Perl.

L'ordine di hash interna è cambiato più volte. Anche se questo non è qualcosa che si dovrebbe dipendere, può causare problemi se involontariamente fai.

incompatibilità binaria tra le grandi (5.x) release è comune, ma che di solito significa semplicemente che tutte le estensioni XS devono essere ricompilati.

L'elenco completo è troppo lungo elencare qui. È possibile ottenere controllando la sezione "Modifiche incompatibile" di di ogni versione storia .

OTOH ci sono alcune caratteristiche selvatici risalenti al Perl 1 che ancora funziona. Per esempio, che cosa fa questa stampa?

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

E 'vero, 23. Perché? Perché "array associativi" non erano oggetti di prima classe in Perl 1. $foo{bar} ha funzionato, ma non c'era %foo. Io davvero non so perché, anche nella pagina Perl 1 uomo riconosce questo è verrucosa. Così, per la compatibilità con Perl 1 è possibile accedere a un hash globale senza utilizzare un %, forse se la tastiera è rotto o Apple decide nessuno utilizza il simbolo %.

chdir ha alcune stranezze. chdir() con alcun argomento vi porterà alla vostra home directory, replicando il comportamento shell cd. Purtroppo così sarà chdir undef e chdir "" rendendo difficile individuare gli errori intorno chdir. Fortunatamente questo comportamento è deprecato. Dovrò assicurarsi che muore in 5.14.

$[ è ancora in giro e rimane undeprecated, ma "fortemente sconsigliato". Cambia ciò che il primo indice di un array è, quindi se sei un essere umano come me e contare da 1 si poteva fare:

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

Perl 5 ha cambiato per essere il file con ambito, come il resto è stato un freno prestazioni e una grande fonte di CrAzY.

Ho avuto alcuni errori funky con Perl4 e Perl5 valutare mano sinistra e lati destro di un incarico in un ordine diverso, citando il trappole Perl per gli incauti :

  

LHS vs. RHS di qualsiasi operatore di assegnazione. LHS viene valutata per prima in perl4, secondo in perl5; questo può influenzare il rapporto tra gli effetti collaterali in sub-espressioni.

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

Per alcune cose nuove e, eventualmente incompatibili, vedi la FAQ tra il Perl4 e Perl5.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top