2012-09-01 11 views
6

vi un Perl un trazador de líneas para generar alguna cadena aleatoria de 8 caracteres:¿Por qué necesito frenillos en el siguiente revestimiento perl one?

perl -le 'print map { ("a".."z")[rand 26] } 1..5'

pero esto no funciona sin la {} para el mapa. ¿Porqué es eso?

+0

¿Cuál fue exactamente el código que no funcionó? Se puede hacer sin '{}'. – aschepler

+1

@aschepler: Sí, pero si eliminas las llaves, entonces necesitas agregar una coma entre el bloque y la lista. –

Respuesta

11

Ver perldoc -f map. map tiene dos formas: map({block} @array) y map(expression, @array). Esta última forma se puede utilizar de esta manera:

perl -le 'print map(("a".."z")[rand 26], 1..5)' 
perl -le 'print map +("a".."z")[rand 26], 1..5' 

La razón

perl -le 'print map ("a".."z")[rand 26], 1..5' 

que no funciona es porque se analiza como

perl -le 'print(((map("a".."z"))[rand(26)]), 1..5)' 

En otras palabras, se convierten en "a".."z" los únicos argumentos de map, que no es válido. Esto se puede desambiguar con un conjunto adicional de paréntesis o con unario +.

+0

¡Gracias! Tiene sentido. –

+0

¿Cómo hizo el nico + ayuda allí? Lo veo mencionado en un ejemplo en el enlace de doc proporcionado pero no estoy seguro de cómo funcionó. ¿Es común evitar los paréntesis en las llamadas a funciones que puedo hacer en google? –

+1

@PalaceChan Se usa para separar 'map' del primer' ('. Este truco es común en las funciones de uso de Perl que toman múltiples argumentos, otros incluyen' grep' y 'print'. – ephemient

Cuestiones relacionadas