Perlのコンテキストを理解しよう
Perlにはコンテキストと呼ばれる概念があります。コンテキストとは文脈という意味で、次の二つのコンテキストがあります。
スカラとして評価される文脈をスカラコンテキスト、リストとして評価される文脈をリストコンテキストと呼びます。
一例としてあげれば、localtime関数は、スカラコンテキストでは、日付・時刻を表示する文字列を返却し、リストコンテキストでは、日付・時刻情報をリストにして返します。
# スカラコンテキスト $date_string = localtime; # リストコンテキスト @date_info = localtime;
もうひとつの一例をあげると、配列は、スカラコンテキストでは、配列の個数を、リストコンテキストでは、要素のリストを返します。
# スカラコンテキスト $count = @values; # リストコンテキスト @elements = @values;
リストについての詳しい解説は以下で行っています。
スカラコンテキスト
スカラコンテキストとして評価される場所を挙げておきます。
スカラ変数への代入
スカラ変数への代入はスカラコンテキストです。配列はスカラコンテキストで評価すると、配列の長さを返します。
my $num = @values;
比較演算子の項
比較演算子の左右の項はスカラコンテキストです。
$x < @values $x == @values
for文のループで頻繁に目にします。
for (my $i = 0; $i < @nums; $i++) { ... }
ifの条件部
ifの条件部はスカラコンテキストです。以下では@valuesはスカラコンテキストで評価されるので、配列の個数を返します。
if (@values) { ... }
スカラコンテキストの詳しい解説は以下で行っています。
リストコンテキスト
リストコンテキストとして評価される場所を上げておきます。
配列への代入
配列への代入はリストコンテキストです。
my @values2 = @values;
リスト
リストの内側はリストコンテキストです。
(@values);
サブルーチンの引数
サブルーチンの引数は、リストコンテキストです。
func(@values);
リストコンテキストの詳しい解説は以下で行っています。
サンプル
スカラコンテキストとリストコンテキストを理解するためのサンプルです。
use strict; use warnings; # スカラコンテキストとリストコンテキスト print "1:localtime関数で、コンテキストの意味を知る。\n"; my $scalar; my @list; # 左辺が、スカラなので、スカラ用 # の戻り値が返ります。 $scalar = localtime; # 左辺が、配列なので、リスト用 # の戻り値が返ります。 @list = localtime; print "スカラコンテキストでは、書式化された日付\n", "'$scalar'\n\n"; print "リストコンテキストでは、年月日と時間の値のリスト\n" . join(',', @list) . "\n\n";
Perlの関数は、スカラを要求される場所では、スカラ用の戻り値を、リストを要求される場所では、リスト用の戻り値を返却することができます。
スカラコンテキストとリストコンテキストの区別は、Perlを触っているうちに自然に覚えていきます。ここで示したのはひとつの例です。左辺がスカラなら、スカラコンテキスト、左辺が配列ならば、リストコンテキストになります。