カテゴリー
Perl

コンテキストを理解しよう

この章ではコンテキストについて説明します。
Perl を理解するためにはコンテキストの知識は欠かせません。
例えば、プログラムを書いている時に配列を変数もしくは配列に代入しなくてはいけない場面があるとします。
この場合にどちらに代入するかで意味が全く違ってしまいます。
もう一つ例を挙げますと、if文の条件式の中に配列を入れた時、その配列の意味は配列の中身を示すのではなく、配列の中に入っている要素数という意味になります。
このように配列や変数は置かれている場所によって意味が違ってしまいます。
この場所の概念をコンテキストと言います。
では例を見てみましょう。11 最初の出力は配列の要素である1を出力していますが、次の出力は配列の要素数の5を出力しています。
このように変数もしくは配列に代入することにより解釈が変わってしまいます。
コンテキストの種類はリストコンテキストスカラーコンテキストの2種類ありまして、Perlは文脈により必ずどちらかで判断しています。
「@e=@p;」の場合は配列を配列に代入しているのでリストコンテキストで解釈して、1の場合は配列を変数に入れているのでスカラーコンテキストで解釈しています。
配列をスカラーコンテキストで判断すると配列の要素数を得ることが出来ます。1 ここからはたくさんの例を見ていただきます。
スカラーコンテキストから見てみます。1 左辺が変数のため、スカラーコンテキストで判断され、リストの最後の要素である7が出力されます。
変数は1つしか値を保持できないため、最後の要素が代入されていると考えてください。1 「+」、「-」、「*」、「/」の演算子は両辺にリストではなく、スカラーを要求するのでこの文はスカラーコンテキストで判断することになります。
その結果、@pはスカラーコンテキストで判断され、配列の要素数である5となりますので、28が出力されます。
これが思い通りの計算結果であればこれでいいのですが、もし、配列の要素の中の合計を期待しているのならば間違いになりますので気を付けてください。1 if文の条件式はスカラーコンテキストを要求しますので、@pは配列の要素数である5になります。
結果は「FALSEです」です。1 配列の要素にデータを代入する時にはスカラーコンテキストで判断します。
これは配列そのものに代入しているわけではなく、配列の中の0番目の要素に代入しているのでスカラーコンテキストで判断されます。
次はリストコンテキストの例を見てみましょう。1 左辺が($a,$b)のようにリストを要求しているので、これはリストコンテキストでこの文を判断することになります。
$aには2が入り、$bには3が入ります。1 これは($f)のように変数1つだけをカッコに囲んでいるだけですが、これはリストコンテキストで判断することになります。
結果は先頭の要素である2です。変数が1つしかないので、2以外の要素は捨てられます。1 foreachの括弧の中の@numは配列の要素を取り出す役割がありますので、リストコンテキストで判断することになります。1 sort文など配列を操作する関数は配列やリストの順番を変えるためにあるのでリストコンテキストで判断することになります。