2012-09-01 12 views
6

私は8つの文字のいくつかのランダムな文字列を生成するperlの1つのライナーを見た:次のperlの1つのライナーで中括弧が必要なのはなぜですか?

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

をしかし、これはマップの{}ないと動作しません。何故ですか?

+0

正常に動作しなかったコードはどうでしたか?それは '{}'なしで行うことができます。 – aschepler

+1

@aschepler:はい、中括弧を削除した場合は、ブロックとリストの間にカンマを追加する必要があります。 –

答えて

11

perldoc -f mapを参照。 mapは、map({block} @array)map(expression, @array)の2つの形式を持っています。後者の形態はこれと同じように使用することができる。

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

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

それは言い換える

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

ように解析するため、"a".."z"になっている動作しない理由mapの唯一の引数は無効です。これは、余分な括弧のセットまたは単体の+で明確にすることができます。

+0

ありがとう!意味をなさない –

+0

どのように単項+はそこに助けましたか?私は提供されたdocリンクの例で言及しているが、それがどのように働いているかはわかりません。私はGoogleができる関数呼び出しで括弧を避けるための共通のものですか? –

+1

@PalaceChanこれは、 'map'を最初の'( ')から分離するために使われます。このトリックは、複数の引数を取る一般的なPerlの使用関数です - 他には' grep'と 'print'が含まれています。 – ephemient

関連する問題