2009-06-14

Perl で強制的にリストコンテキストで評価する方法

Perl で強制的にスカラーコンテキストで評価するには scalar を用いるが,強制的にリストコンテキストで評価するための list (仮称) は用意されていない.

man perlfuncscalar の項によると,これは実質的には全く必要無いからだそうであるが,両コンテキストで異なる値を返す関数がリストコンテキストで返すリストの要素数を中間変数なしに知りたい場合に困る.

例えば文字列中の / の数を数えようと思って,

$n = scalar split "/", $s;

とすると,split がスカラーコンテキストで評価されることにより @_ の変更が副作用として起こってしまう.use warnings をしていると警告も出力される.そこで強制的にリストコンテキストで split を呼び,それを scalar に渡すようにすれば解決する.これには @{[...]} を用いる.

$n = scalar @{ [ split "/", $s ] };

[ ] はリストへのリファレンスを返し,その中はリストコンテキストで評価される.@{ } はリファレンスをリストに戻す.[ ] 内におく表現によってはそれを ( ) で囲む必要があるかもしれない.

今回の場合には適用できないが,単に (...) で済む場合が多い.

0 件のコメント:

コメントを投稿