少し反応をいただいたので追記。
木村さんの「‘=>’の右辺にあるからリストコンテキストになるというのはちょっと違うような気がします。」について。実装の話ではなくあるべき仕様の話をしています。lexerの段階でカンマとしてpushしてしまい、二項演算として左右のオペランドの結合を保存しないのであれば、list contextになるのは道理ですね。実装から見て、さほど練られた仕様ではなさそうだということはわかりました。ありがとうございます。
みすらんさんの「そんなときにはscalarを使えばいいと思う。=>にスカラーコンテキスト提供されたりしたらリスト演算子で使えなくなって不便、とか。」(リンク先はいずれ流れて消えちゃうみたいです)について。リスト演算子はカンマがあるのでいいんじゃないでしょうか。二重矢印を使うからには、左にあるものと右にあるものの関連を示唆しているはずですが、解釈がそれを逸脱するのはいただけないと思います。
そうそう、二重矢印の右に配列を置く例に思い当たった。「$obj->send(some_method => @arguments)」みたいな書き方はたまに見る。メソッド名はちゃんと引用符で括って、二重矢印でなくカンマを置けばいいのに、こういう書き方が好きなPerlプログラマは多いみたい。しかし、二重矢印で書くなら右はarrayrefの方がふさわしいんじゃないかと思う。
文法や仕様でなく、挙動や実装の方に寄りかかる習慣が常態化しているのは気持ち悪い。でも、裏をかくのが楽しいのは事実。Perl5が出たとき、危なっかしいギミック満載でドキドキしたのを思い出す。13年も前か、と言いかけて、あれ、たったの13年前か、と思った。この世界は進むのが速い分、振り返ると実時間は大して経っていないんだな。
Perlは文法上、(右)二重矢印「=>」をカンマ「,」と同義としている。カンマとの違いとして、二重矢印の左オペランドにbare wordを置くと文字列化される。これによって、ハッシュなど二つの値の組を書いたときにそれっぽく見える。
そこに、罠がある。常識で考えて二重矢印の右オペランドはscalar contextだろう…と思いきや、なんとlist (array) contextなのだ。次のようなコード断片を考える。
my $conn = Client->connect(server => $config->server,
username => $username,
password => $password,
timeout => 30);
単体で見れば、まったく問題なさそうに見える。しかし、$configのserverメソッドが気を利かせて、scalar contextならプライマリサーバの単値、list contextなら全サーバの配列を返す、のようなことをしてくれた瞬間、破綻してしまう。たとえば、$configが要素二つの配列を返すと、connect()メソッドに渡す引数列は('server', 'host1', 'host2', 'username', 'someone', 'password', 'something', 'timeout', 30)のようになり、これをハッシュで受ければ('server' => 'host1', 'host2' => 'username', 'someone' => 'password', 'something' => 'timeout', 30 => undef)となってひどいことになる。また、取得できないときに空の値(undefや'')でなく空配列(())を返すような実装になっていても同様だ。
Perl5のbare wordやcontextに関してはいろいろ疑問を持っていて、いちばん痛い例(文法エラーにも型エラーにもならず、例えば上の例では奇数個の配列が返るときなど顕在化すらしない)がこれなのだが、Larry Wallがその「人間の意図をできるだけ理解して動く」という哲学を徹底するのなら、二重矢印の右側はscalar contextにすべきだった。ここでリスト展開されてうれしいケースはちょっと思いつかない。
今さらPerl5の文法仕様が変わることはないので、せいぜい注意しよう。さすがにPerl6では、contextの概念が変わったり、二重矢印がPairを生成したり、配列がオブジェクトになったりしているので同じ問題は存在しない。別のひずみがある気がするが、それはいずれ。