2012-09-01 12 views
6

vidi un perl uno di linea per generare una stringa casuale di 8 caratteri:Perché ho bisogno di parentesi graffe nella seguente perl one liner?

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

ma questo non funziona senza la {} per la mappa. Perché?

+0

Che cosa è esattamente il codice che non ha funzionato? Può essere fatto senza '{}'. – aschepler

+1

@aschepler: Sì, ma se hai rimosso le parentesi graffe, devi aggiungere una virgola tra il blocco e l'elenco. –

risposta

11

Vedere perldoc -f map. map ha due forme: map({block} @array) e map(expression, @array). Quest'ultima forma può essere utilizzato in questo modo:

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

La ragione

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

non funziona è perché analizza come

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

In altre parole, diventano "a".."z" gli unici argomenti di map, che non è valido. Questo può essere disambiguato con un set aggiuntivo di parentesi o con un unario +.

+0

Grazie! Ha senso. –

+0

In che modo l'unario + ci ha aiutato? Lo vedo menzionato in un esempio nel collegamento doc fornito ma non sono sicuro di come funzioni. È una cosa comune evitare le parentesi nelle chiamate di funzione che posso google? –

+1

@PalaceChan Si usa per separare 'map' dal primo' ('. Questo trucco è comune alle funzioni d'uso di Perl che accettano più argomenti - altri includono' grep' e 'print'. – ephemient

Problemi correlati