Perché 'ultimo' si chiama 'ultimo' in Perl?
-
06-07-2019 - |
Domanda
Qual è la ragione storica per cui last
viene chiamato in Perl piuttosto che break
come viene chiamato in C?
Il design di Perl è stato influenzato da C (oltre a awk, sed e sh - vedi la pagina man in basso), quindi ci deve essere stato qualche ragionamento dietro non andare con la familiare denominazione in stile C di break / last.
Un po 'di storia dalla pagina man Perl 1.000 (rilasciata il 18 dicembre 1987):
[Perl] combina (secondo l'opinione dell'autore, comunque) alcune delle migliori caratteristiche di C, sed, awk e sh, quindi le persone che hanno familiarità con quelle lingue dovrebbero avere poche difficoltà con esso. (Gli storici linguistici noteranno anche alcune vestigia di csh, Pascal e persino BASIC | PLUS.)
Soluzione
La semantica di 'break' o 'last' sono definito dalla lingua (in questo caso Perl), non da te.
Perché non pensare a 'last' come " questo è l'ultima istruzione da eseguire per ciclo ".
Mi è sempre sembrato strano che il L'istruzione "continue" in "C" avvia il file prossimo passaggio di un ciclo. Questo è sicuramente uno strano uso di concetto di "continua". Ma è il semantica di "C", quindi la accetto.
Provando a mappare particolari concetti di programmazione in singolo Parole inglesi con significato esistente ci sarà sempre un qualche tipo di stranezza non corrispondente
Inoltre, Larry Wall è un po 'strano. Hai visto la sua foto?
(fonte: wired.com )
Altri suggerimenti
Mi aspetto che ciò sia dovuto al fatto che Perl è stato creato da un linguista, non da un informatico. Nell'uso normale dell'inglese, il concetto di dichiarare di aver completato il passaggio finale attraverso un ciclo è più fortemente collegato alla parola "last" (" questo è l ' ultimo passaggio ") rispetto alla parola " break " (" interrompi il ciclo " ;? " interrompi fuori dal ciclo " ;? - non è nemmeno chiaro come si intende che "interrompi "" si riferisce all'uscita dal ciclo) .
Il termine 'ultimo' ha più senso quando ricordi che puoi usarlo con più del semplice controllo di loop immediato. Puoi applicarlo ai blocchi etichettati di uno o più livelli sopra il blocco in cui si trova:
LINE: while( <> ) {
WORD: foreach ( split ) {
last LINE if /^__END__\z/;
...
}
}
Si legge più naturalmente per dire "ultimo" in inglese quando lo leggi come " ultima riga se corrisponde ... " ;.
C'è un motivo in più che potresti prendere in considerazione:
Last fa molto di più del semplice controllo in loop.
sub hello {
my ( $arg ) = @_;
scope: {
foo();
bar();
last if $arg > 4;
baz();
quux();
}
}
Ultimo in quanto tale è un meccanismo generale di controllo del flusso non limitato ai circuiti. Mentre, naturalmente, puoi generalizzare quanto sopra come un loop che viene eseguito al massimo 1 volte, l'assenza di un loop per me indica "Break? Da cosa stiamo uscendo? & Quot;
Invece, penso a " last
" come " Vai alla posizione del ult parentesi graffa " ;, che è a questo scopo, più semanticamente sensibile.
Stavo facendo la stessa domanda a Damian Conway riguardo a dire
. Perl 6 introdurrà dire
, che non è altro che stampa
che aggiunge automaticamente una nuova riga. La mia domanda era: perché non usare semplicemente echo
, perché questo è ciò che echo
fa in Bash (e probabilmente altrove).
La sua risposta è stata: echo
è più lungo del 33% rispetto a say
.
Ha un punto lì. :)
Perché va all'ultimo del ciclo. E perché Larry Wall era un tipo strano.