§3.1 リストと配列


作成日:2001/06/25(月)

「リスト」とは、0個以上のスカラーの集まりのことです。 また§1.4 嬉しい悩みでも見たように、リストのそれぞれの要素(データ)に0から始まる順番(インデクス)をつけたものを「配列」といいます。 リストと配列の違いは、「リストには名前はないが配列には名前がついている」ということと、そのサイズ(要素の個数)を自由に変更できるかどうかというところです。 後で出てくるpushやpopなどの関数は、配列に対して作用するものであり、リストには適用できません。
 この節ではリストと配列の作り方について見て行きます。

リストの作り方

といってもそんなに難しいことはありません。 リストを作るには、それぞれのデータの間にカンマ( , )をいれます。 例えば、

 ("can", 43, "masa", 81, "hide", 69);
 ();  #空のリスト
 ($a, 3*$b - 4);  #変数や式も格納できる

最初と最後の括弧はつけなくてもいいのですが、優先順位の関係でPerlに間違えて解釈されないようにするためにつけておいた方が無難です。 また上の例のように、Perlのリストには、数値と文字列をごちゃ混ぜにしていれることも出来ます。 リストは「スカラー」の集まりであり、数値も文字列もスカラーなのでこのような事ができるのです。 更に、空のリスト(1つも要素を持っていないリスト)をつくることも出来ますし、最後の例のように、変数や式を要素にすることも出来ます。 この場合、それぞれの変数の値や式の結果が要素として格納されます。
 また、スペースを区切り文字として文字列のリストを返すqw()構文も使えます。

 qw(harahoro hirehare gachoon biroon);

とすると、シングルクォートで囲んだ文字列のリスト

 ('harahoro', 'hirehare', 'gachoon', 'biroon');

となります。

 

範囲演算子..

スクリプトを書いていると、

 (1, 2, 3, 4, 5);

というようなリストを作りたいという機会が出てきます。 このようなときに便利な書き方があります。 それは

 (1 .. 5);

というものです。 この範囲演算子..(ピリオド2個)を使うと数値や文字列の範囲を指定できます。

 (1 .. 5);  #(1, 2, 3, 4, 5)と同じ
 ('a' .. 'z');  #aからzまでをセット
 (5 .. $x);  #5から$xの値までの数値をセット

上の最後の例では、$xの値が5より小さい場合、空のリストを作ります。

配列の作り方

次に配列を作ります。 §1.4 嬉しい悩みで、「配列とは簡単に言うと、スカラーがいっぱい乗った台車のようなもの」と書きました。

配列はスカラーがいっぱい乗った台車

配列を作るには次のようにします。

 @array = ("can", 43, "masa", 81, "hide", 69);

このように、配列名の先頭には@(半角のアットマーク)をつけます。 次に続くのが配列名です。 スカラー変数同様、配列名には英文字、数字、アンダースコア(_)が使えます。 また大文字と小文字を区別するので、@arrayと@Arrayは別の配列となります。 さらに$nameと@nameは、名前は同じでもPerlはちゃんと別々の物として扱ってくれます。
また既存の配列を使って新しい配列を作ることも出来ます。

 @array = ("can", 43, "masa", 81, "hide", 69);
 @new_array = ("toshi", 58, @array, "yoshiki", 99);

とすると@arrayの中身が全て展開されて、@new_arrayの該当位置に展開します。 なので

 @new_array = ("toshi", 58, "can", 43, "masa", 81, 
       "hide", 69, "yoshiki", 99);

としたのと同じ結果になります。

次の例のように、スカラー変数や配列で構成されたリストに、リストの中の値を代入することも出来ます。

 ($a, $b) = ("harahoro", "hirehare");
 #$aに"harahoro"、$bに"hirehare"を代入

 ($c, $d) = (28, 35, 42);
 #$cに28、$dに35を代入。 42は切り捨て。

 ($e, $f, $g) = (49, 56);
 #$eに49、$fに56を代入。 $hは未定義(undef)

 ($i, @j) = (63, 70, 77, 84);
 #$iに63を、@jには(70, 77, 84)からなるリストを代入。

 (@k, $l) = ("hairetu", "ha", "yokubari");
#@kには右辺のリストが全部代入され、$lは未定義。

最後の例は注意が必要です。 配列はとても欲張りなので、右辺のリストの、該当位置より後ろの値を全部持っていってしまいます。 これらのような書き方は、日付を返すlocaltime関数や、ファイルの情報を返すstat関数を使うときに使用されます。

 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)
   = localtime(time);

左辺のリストの中は順に秒、分、時、日付、月、年、曜日、元旦からの日数、サマータイムフラグ(サマータイムのときは1、そうでないときは0)を表します。

リストと配列の作り方はわかっていただけたでしょうか? 次の節では、配列の個々の要素にアクセスする方法を取り上げます。


「§2.3 演算子」へ 「§3.2 配列の要素にアクセスする」へ
ソフトバンク パブリッシング株式会社

Copyright (C) can All Rights Reserved
e-mail:ishiki@mrj.biglobe.ne.jp