last-modified: 12th/June/'01;
since: 1st/June/2001;
前節までで、条件分岐、繰り返し、ファイルに対する入出力、正規表現を紹介しました。
スクリプトには変数が不可欠だということが認識できたと思います。ひとつの値だけしか代入できないものをスカラー変数と呼びます。スカラー・データが複数代入されているものを、一般に配列と呼びます。
配列は二種類に分けられます。ひとつはスカラー・データが順番に並んだもので、これをベクトルと呼びます。もうひとつはデータが表のように並んだもので、これをマトリックス(行列)と呼びます。
ベクトルやマトリックスの中で並んでいる個々のデータは、要素と呼びます。例えば、スカラー・データ a, b, c がこの順番で並んだ全体はベクトルであり、 a, b, c はそれぞれベクトルの要素です。
Perl ではベクトルを扱う変数には二つの種類があり、それぞれ配列変数、ハッシュ変数と呼びます。マトリックスを扱う変数は用意されていませんが、「配列を要素とする配列」として実現できます。このような構造的なデータを実現するために、配列やハッシュを指し示す「指示語」の働きを持つ仕組みが用意されており、リファレンスと呼びます。
通常の配列はスカラーデータが順番に並んだもので、個々のスカラーデータは番号で参照します。番号は 0 から始まり、負値の場合は最後から数えます。ハッシュ(hash)はスカラーデータが相関的に配列したもので、個々のスカラーデータは、番号ではなく、対応する文字列(associated string key)で参照します。
スカラー変数というのは、値が一つだけ代入される変数のことです。前節までで何度も登場しましたが、 $ から始まります。
$days, $i | 通常のスカラー変数です。 |
$_, $&, $`, $' | あらかじめ定義済みの特殊変数です。 |
$days[2] | 配列変数 @days の二番目の要素です。 |
$days{'Feb'} | ハッシュ %days のキー Feb に対応する要素です。 |
$#days | 配列変数 @days の最後の要素番号です。 |
配列の要素は 0 から番号付けされていきますから、 四番目の要素の番号(インデックス)は 3 になります。配列 @days の要素の個数は $#days + 1 になります。
特殊変数のうち幾つかをまとめておきます。
$_ ($ARG) |
標準入力とパターン検索 |
$& ($MATCH) |
最後にパターンマッチした文字列 |
$` ($PREMATCH) | 最後にパターンマッチした文字列よりも前にあった文字列全て |
$' ($POSTMATCH) | 最後にパターンマッチした文字列よりも後にあった文字列全て |
$n ($1, $2, $3,...) | パターンマッチしたときに、正規表現の n 番目グループにマッチした文字列 |
$! ($OS_ERROR, $ERRNO) | 数値としてはシステムエラー番号。文字列としてはシステムエラーメッセージ。 |
スカラー変数が順番に並んだ全体を配列と呼びます。
配列全体は @ から始まる任意の英数文字列で指定します。個々の要素は番号で指定します。
配列 @days に四個のスカラー値が要素として入っていれば、要素のそれぞれは $days[0], $days[1], $days[2], $days[3] と記述できます。
配列の個々の要素を列挙して括弧で括ったものをリストと呼びます。
@days = ($days[0], $days[1], $days[2], $days[3])
$days[n] と $days は全く別のものなので、スクリプト中に共存して構いません(記述ミスを誘いそうですが)。
リストを左辺に書いて、配列変数の個々の要素をスカラー変数に代入することもできます。
($a, $b, $c) = @hoge; # $a = $hoge[0], $b = $hoge[1], $c = $hoge[2]
($a, $b, @foo) = @hoge; # $a = $hoge[0], $b = $hoge[1],
# @foo = ($hoge[2], $hoge[3], $hoge[4])
(@foo, $a, $b) = @hoge; # $foo = ($hoge[0], $b = $hoge[1], $hoge[2], $hoge[3], $hoge[4])
# $a, $b には何も入らない。
リストの要素に配列が入っても、マトリックスにはなりません。例えば、四つの要素をもつ配列 @a, @b, @c があったとします。
(@a, @b, @c) # ($a[0], $a[1], $a[2], $a[3],
# $b[0], $b[1], $b[2], $b[3],
# $c[0], $c[1], $c[2], $c[3]) と同じ
@array = (@a, @b, @c);
$array[4]; # $a[3] と同じ
$array[5]; # $b[0] と同じ
@array = (@a,@b,@c) は「4行3列」のマトリックスにはならないことに注意してください。
配列やハッシュの一部分を抜き出すこともできます。これを、配列やハッシュのスライス(slice)と呼びます。
@days[3,4,5] = ($days[3], $days[4], $days[5]);
@month{'Feb', 'Mar'} = ($month{'Feb'}, $month{'Mar'});
配列は、例えば複数の値それぞれに同じ処理を繰り返したい場合に有用です。
次のスクリプトは、配列 @days の全ての要素を書き出すスクリプトです。
for ($i=0; $i <= $#day; $i++) {
print "$i, $days[$i]\n";
}
for 文の書式は、【for(初期化式; 比較式; 終端式) {......}】 になっており、「繰り返し回数を蓄えておく変数の初期値 $i = 0」と、「繰り返し終了の条件式 $i <= $#days」と、「繰り返しが一回終わる毎にする処理 $i++」になっています。
$#days は配列 @days の最後の要素の番号(インデックス)です。比較式 $i <= $#dasy は、 $i がゼロから $#days まで繰り返しを指定することで、つまり配列の要素の個数回繰り返します。ちなみに、関係演算子 <= は、数字同士を比較して「以下(小なりイコール)」を意味します。
終端式は $i = $i + 1 の省略形で、繰り返しが一回終わるごとに $i をひとつ増やすことを意味します。
配列は繰り返し処理に強いのですが、 Perl では foreach 文を使うことでもっと簡単に実行できます。その話はまた後で。
コンテキストとは「文脈」程度の意味です。
「先ほど配列 @hoge の最後の要素の番号は #@hoge」を紹介しました。
しかし、配列を数値として呼び出すと、「要素の個数」を意味します。従って、先ほどの繰り返しのスクリプトは次のように書けます。
for ($i=0; $i < @days; $i++) {
print "$i, $days[$i]\n";
}
@days は、数値データ同士を比較する演算子 a < b (aはb未満)の右辺にあるので、明らかに数値(スカラーデータ)として参照されています。従って、 $i < @days は、「$i が配列 @days の要素の個数未満」を意味します。
このように演算結果を暗示的に型変換することを、演算のコンテキストと呼びます。配列を要求するコンテキストを配列コンテキスト、スカラーを要求するコンテキストをスカラーコンテキストと呼びます。
$size = @days; #$size は @days の要素の個数 ($first) = @days; #($first) はリストで、 $first は @days の第一要素(0 番目要素)
ハッシュもスカラー値の集合ですが、要素の指定には、番号ではなく、対応する文字列を使います。ハッシュの要素を指定する文字列をキーと呼びます。
ハッシュは % から始まる任意の英数字列です。
%days = (key1, val1, key2, val2, key3, val3)
ハッシュは、例えば用語集や、住所録・人名録、HTML のフォームデータなどの場合に有効です。
%physgros = ('物理学','物質的現象の解明を目的とする。',
'力学','近・現代世界の精神的支柱となる。',
'現代物理学','一般には量子力学と相対性理論を指す。',
'パラダイム','科学理論において、参照すべき理論・方法などの集合。');
%htmltag = (html, 'ドキュメント・ルート',
head, '文書ヘッダ', title, '文書タイトル',
body, '文書本文', p, '段落');
%colors = ('red',ff000,'blue',000ff,'green',00ff0);
これではキーと値を混乱しそうです。このようなときには、 => を利用すると良いでしょう。
%colors = (red => ff0000, blue => 0000ff, green => 00ff00);
ハッシュもスライスできます。配列のときは要素番号を指定するのに「 [ 」を用いましたが、ハッシュでは「 { 」を用いることに注意してください。
%colors = (red => ff0000, blue => 0000ff, green => 00ff00);
$colors{'red'} = 000ff;
@colors{'red','blue'} = (ff0000, 0000ff);
%from = ('name',$form{'name'},'mail',$form{'mail'},'url',$form{'url'},
'body',$form{'body'});
次節では配列特有の函数などについて、サンプル・スクリプトを用いて紹介します。
Copyright: SUGAI, Manabu. Since: 2001