2012-09-01 6 views
6

sah ich ein Perl-Einzeiler eine zufällige Folge von 8 Zeichen zu erzeugen:Warum brauche ich Zahnspangen im folgenden Perl-Liner?

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

aber das funktioniert nicht ohne die {} für Karte. Warum das?

+0

Was genau war der Code, der nicht funktioniert hat? Es kann ohne '{}' gemacht werden. – aschepler

+1

@aschepler: Ja, aber wenn Sie die geschweiften Klammern entfernen, müssen Sie ein Komma zwischen dem Block und der Liste hinzufügen. –

Antwort

11

Siehe perldoc -f map. map hat zwei Formen: map({block} @array) und map(expression, @array).

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

Der Grund

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

nicht, weil es wie

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

Mit anderen Worten parst, "a".."z" werden: Letztere Form kann wie so verwendet werden, die einzigen Argumente von map, die nicht gültig ist. Dies kann mit einem zusätzlichen Satz von Klammern oder mit einem unären + disambiguiert werden.

+0

Danke! Macht Sinn. –

+0

Wie hat das unäre + dort geholfen? Ich sehe es in einem Beispiel im Doc Link erwähnt aber nicht sicher wie es funktioniert. Ist es üblich, Klammern in Funktionsaufrufen zu vermeiden, die ich googlen kann? –

+1

@PalaceChan Es wird verwendet, um 'map' vom ersten' ('zu trennen. Dieser Trick ist gängige Perl-Verwendung Funktionen, die mehrere Argumente nehmen - andere gehören' grep' und 'print'. – ephemient