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?
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?
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.
Danke! Macht Sinn. –
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? –
@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
Was genau war der Code, der nicht funktioniert hat? Es kann ohne '{}' gemacht werden. – aschepler
@aschepler: Ja, aber wenn Sie die geschweiften Klammern entfernen, müssen Sie ein Komma zwischen dem Block und der Liste hinzufügen. –