IMO, una gran cosa para salir de léxico $_
es el nuevo prototipo _
símbolo.
Esto le permite especificar una subrutina para que tome un escalar o si no se proporciona ninguna, tomará $_
.
Así que en lugar de escribir:
sub foo {
my $arg = @_ ? shift : $_;
# Do stuff with $_
}
me puede escribir:
sub foo(_) {
my $arg = shift;
# Do stuff with $_ or first arg.
}
No es un gran cambio, pero es sólo que mucho más simple cuando quiero que el comportamiento. La remoción repetitiva es algo bueno.
Por supuesto, esto tiene el efecto de knock-on de cambiar los prototipos de varios builtins (por ejemplo, chr
), lo que puede romper un poco el código.
En general, doy la bienvenida a léxico $_
. Me da una herramienta que puedo usar para limitar el munging de datos accidentales y las interacciones extrañas entre funciones. Si decido usar $_
en el cuerpo de una función, al lexicalizarlo, puedo estar seguro de que cualquier código que llame, $_
, no se modificará en el código de llamada.
El alcance dinámico es interesante, pero en su mayor parte quiero un alcance léxico. Agregue a esto las complicaciones alrededor de $_
. He escuchado terribles advertencias sobre la inconveniencia de simplemente hacer local $_;
, que en su lugar es mejor usar for ($foo) { }
.Lexicalized $_
me da lo que quiero 99 veces de cada 100 cuando he localizado $_
por cualquier medio. Lexical $_
hace una gran conveniencia y la característica de legibilidad más robusta.
La mayor parte de mi trabajo ha tenido que trabajar con Perl 5.8, por lo que no he tenido la alegría de jugar con el léxico $_
en proyectos más grandes. Sin embargo, se siente como que esto hará un largo camino para hacer que el uso de $_
sea más seguro, lo cual es algo bueno.
Creo que la respuesta a su pregunta es en su mayoría cubierto [aquí] (http://stackoverflow.com/questions/3393038/does-my-do-anything-if-is-implied) en la respuesta a mi pregunta. – xenoterracide
@xenoterracide => La respuesta allí ciertamente cubre algunos de los aspectos del léxico '$ _', pero no todos. Eso es lo que me gustaría cubrir aquí. –
Lo sé, pero también podría tener un buen lugar para empezar;) – xenoterracide