12章 コンテキスト

さあ、今回は、「コンテキスト」の話をします。


コンテキストとは、なんでしょうか?

つぎのような日本語を、まず考えてみることにしましょう。

1 はしで食べる。
2 はしを渡る。

1の方の、「はし」は、「箸」ですね。 2の方は、「橋」です。


こんな感じで、前後の関係つまり、文脈から、単語の意味を推測することができます。
「コンテキスト」とは「文脈」のことです。このように、文脈から判断して、Perlが挙動を変えるといったことをしてくれるのです。それが「コンテキスト」です。



それでは、Perlのコンテキストを紹介します。
ここでは、「スカラーコンテキスト」と「リストコンテキスト」というもの紹介します。


配列まで学んだ皆さんなら、きっと理解できるはずですよ。
コンテキストの意味は説明しましたので、「スカラー」と「リスト」の説明をしたいと思います。
スカラー」とは、「ただひとつ」という意味です。それに対して、「リスト」とは「たくさん」といった意味合いです。



今まで、「箱」のイメージだった、 $x など、$で始まっているものこれは、たった1つの値しか入れれませんでした、ですから、「スカラー変数」と呼ばれます。それに対して、「タンス」のイメージの配列は、複数つまりたくさんの値を入れれますね。ただ、配列は、リスト変数とは呼ばれません。

さて、配列は、

my @array = (1,'a','b', 2);

こんな感じで値を代入できました。

スカラー変数なら、

my $x = 1;

こんな感じです。
では、

my $x = (1, 'a', 'b', 2);

とすると$xには何が入るでしょうか?
最後に書かれている値である「2」が入ります。
$xはスカラーですから、「1つ」しか入れることができません。このときPerlは、最後に書かれた値を代入します。
このような文が「スカラーコンテキスト」です。

では、もう一度、

my @array = (1,'a','b', 2);

を考えてみましょう。 @arrayには、 1, 'a', 'b', 2という4つの値が入ります。「たくさん」の値を代入することができました。ですから、この文は「リストコンテキスト」なのです。

では、

my ($x, $y) = ('a', 'b');

とするとどうでしょうか? $xには、'a'が、 $yには、'b'が代入されます。これは、ひとつずつは、スカラー変数ですが、たくさんの値を扱うことができましたので、「リストコンテキスト」です。


さて、この「コンテキスト」というのは何がすごいのでしょうか?
このすごさを味わっていきたいと思います。
つぎの、プログラムを実行してみてください。$xには何が入っていますか?

my @array = (1,2,'c');
my $x     = @array;
print "$x\n";

実行すると3と表示されましたね。 そうなんです、$xには3という値が入ったのです。
3は、@arrayの「大きさ」です。 おっと、配列の「大きさ」という言葉を説明して置かねばなりません。配列の「大きさ」とは、配列に何個の値(要素)が入っているかという事です。@arrayには今、3つの値が入っているので「大きさ」は3となります。



つまり、配列を、「スカラーコンテキスト」で評価した場合は、配列は「大きさ」を教えてくるのです(「返す」と言う)。また、「大きさ」のことを「長さ」と呼んだりもします。

つぎのように、@other_arrayに代入しているところは、「リストコンテキスト」です。

my @array       = (1,2,'c');
my @other_array = @array;

「リストコンテキスト」ですので、@other_arrayには、@arrayの中身がコピーされるだけです。

for(@other_array){
  print "$_\n";
}

で、中身を表示させてみてください。


このように、Perlは、「コンテキスト」によって、挙動を変えるのです(変数の見方を変えたりなどする)。



じつは、forの配列を与えている部分も、「リストコンテキスト」なのです。


「リストコンテキスト」ですから、複数の値を扱えます。

my ($x, $y, $z) = (1, 'b', 3);  # リストコンテキストで代入

for($x, $y, $z){
  print "$_\n";
}

これは、つぎのように表示されます。

1
b
3

forの配列を与えるところには、このように複数の値を与えることが可能なのです。

あっと、

# リストコンテキスト

の部分が気になりますね。これは、「コメント」といって # より後ろに書かれた部分をPerlは無視をします。
このように、プログラム中に説明書きをいれたいときに「コメント」はよく使われます。



今回は、「コンテキスト」というモノを学びました。これを使いこなせるとかなり強力になりますので、ぜひマスターしていってください。あわせて、「コメント」というものも最後に学びました〜。


おっと、ここで前回のお話にもどりましょう。
前回なぜ、$kyoushitu[0]と@ではなく$を使ったのでしょうか?

もうお分かりですね。配列それ自体は複数の値(要素)を持っていますが、そのひとつずつを扱いたい場合は、「たったひとつ」つまり、「スカラー」であることを示すために、$にしなければいけないのです。
スカラー」は英語で、「scalar」と書きます。$は、「S」に見えませんか? scalarの頭文字のSから、スカラーを示すために$が使われたのです。