IMO, una grande cosa da venire fuori lessicale $_
è il nuovo simbolo prototipo _
.
Ciò consente di specificare una subroutine in modo che venga eseguita una scalatura o se non ne viene fornita nessuna acquisirà $_
.
Così, invece di scrivere:
sub foo {
my $arg = @_ ? shift : $_;
# Do stuff with $_
}
mi può scrivere:
sub foo(_) {
my $arg = shift;
# Do stuff with $_ or first arg.
}
Non un grande cambiamento, ma è solo che molto più semplice quando voglio che il comportamento. La rimozione della piastra di caldaia è una buona cosa.
Ovviamente, questo ha l'effetto immediato di modificare i prototipi di diversi builtin (ad esempio chr
), che potrebbero danneggiare alcuni codici.
Nel complesso, accetto il lessico $_
. Mi dà uno strumento che posso usare per limitare i dati accidentali e le interazioni bizzarre tra le funzioni. Se decido di usare $_
nel corpo di una funzione, per lessicalizzarlo, posso essere certo che qualunque sia il codice che chiamo, $_
non verrà modificato nel codice chiamante.
L'ambito dinamico è interessante, ma per la maggior parte desidero lo scoping lessicale. Aggiungi a questo le complicazioni intorno a $_
. Ho sentito terribili avvertimenti sull'invisibilità di fare semplicemente local $_;
- che è meglio usare invece for ($foo) { }
.Lexicalized $_
mi dà quello che voglio 99 volte su 100 quando ho localizzato $_
con qualsiasi mezzo. Lexical $_
offre una grande praticità e una migliore leggibilità.
La maggior parte del mio lavoro ha dovuto funzionare con perl 5.8, quindi non ho avuto la gioia di giocare con lessicale $_
in progetti più grandi. Tuttavia, sembra che questo farà molto per rendere l'uso di $_
più sicuro, che è una buona cosa.
Penso che la risposta alla tua domanda è in gran parte coperto [qui] (http://stackoverflow.com/questions/3393038/does-my-do-anything-if-is-implied) nella risposta alla la mia domanda. – xenoterracide
@xenoterracide => La risposta include certamente alcuni aspetti del lessico '$ _', ma non tutti. Questo è quello che vorrei coprire qui. –
Lo so ma potrebbe anche avere un buon punto di partenza;) – xenoterracide