Perl入門   No.8


4.5 配列
 
配列とは、メモリーを効率よく使うために考案された変数のかたまりで、どのプログラム言語にもあります。たとえば、
 
山口太郎と山口花子と山口次郎の三人家族がいます。これをスカラー変数で表記すると、
$山口_1 = 太郎;
$山口_2 = 花子;
$山口_3 = 次郎;
 
というような書き方になりますが、これを山口さんという苗字で締めくくれば、山口という苗字の変数で一度に表記することができます。つまり山口家でくくって、中に三人いるという書き方をするわけです。
 
山口を変数とするならば、普通の変数(Perlではスカラー変数)とは違って、中には三つの要素があります。
山口  太郎、花子、次郎
 
このような変数の使い方を配列と呼んでいます。
Perlでは、配列の書き方は、変数文字列の頭に @ をつけます。そしてそれぞれの構成要素を示すには、[]を変数の後に付けて、何番目かを示す数字を入れます。
@山口[0] = 太郎;
@山口[1] = 花子;
@山口[2] = 次郎;
 
という書き方をします。(数字は0,1,2 となっていることに注意。1,2,3 ではない。)
実際には、変数に仮名漢字を使うとややこしくなりますので、
@yamaguchi = ("太郎","花子","次郎");
 
と書きます。左辺は配列変数、右辺は具体的に格納されている内容です。()のような書き方を配列リテラルと呼んでいます。
もちろん数値も入れることが出来ます。
@yamaguchi = (1..5);
 
とすると、@yamaguchi = (1,2,3,4,5)と書くのと同じです。()内の . を二つ並べて書く方法をリスト構成演算子と呼んでいます。
 
配列に格納されている内容を取り出すには、
@yamaguchi[0];
@yamaguchi[1];
@yamaguchi[2];
 
とします。具体的にやってみましょう。
#!/usr/bin/perl

@yamaguchi = ( "太郎","花子","次郎" );
$kazoku = @yamaguchi[1];

print $kazoku;
 
で、花子 が出れば成功です。
 
配列変数を使わなければ、
#!/usr/bin/perl

$yamaguchi_1 = "太郎";
$yamaguchi_2 = "花子";
$yamaguchi_3 = "次郎";

print $yamaguchi_2;
 
と書くことになります。何が便利かというと、多くの変数を使うとわずらわしくなり、誤りが多くなります。そこで同じ目的の変数ならばひとくくりにしてしまおうというわけです。そしてこのことはメモリーとおおいに関係があります。変数を一つ新しく設定すると、メモリー上にその値を格納する場所が新しく作られます。配列変数の場合は、それぞれの要素はインデックスが付けられてメモリー上に確保されます。効率のよい変数の配置を工夫しているのが配列変数です。
 
例  日時を出力する
#!/usr/bin/perl

# コンピュータシステムから時間を取得し、それぞれの変数に格納する

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

# $nitizi = localtime(time);
# print $nitizi;
# のようにスカラー型で受け取ると
# wday mon day hh:mm:ss yyyy
# という書式で値が戻ってきます。
# 何年何月何日(曜日)何時何分何秒
# という形で出力したければ、
# localtime関数を配列型で受け取ります。配列型の場合、
#
#                価の範囲 スカラー変数に格納した配列リテラル
#
# @time_local[0]  秒         0〜59     $sec
# @time_local[1]  分         0〜59     $min
# @time_local[2]  時         0〜23     $hour
# @time_local[3]  日         1〜31     $mday
# @time_local[4]  月         0〜11     $mon
# @time_local[5]  年         西暦 - 1900   $year
# @time_local[6]  曜日        0〜6     $wday
# @time_local[7]  元旦からの日数   0〜365    $yday
# @time_local[8]  夏時間の有無    0または1   $isdst
#
# となるので、配列リテラルを利用して、それぞれスカラー変数値に代入します。

# 日曜から土曜までの曜日の漢字表記を配列に格納する

@dayname = ( '日', '月', '火', '水', '木', '金', '土');

# システム時間から取り出した月データは 0 から始まるので 1 を足す

$month = $mon + 1;

# 何月何日の日付形式に整える
# 曜日がミソ。$wdayも日曜日から始まる数字で示されているので、
# 配列から曜日を取り出すようにする。例えば、@daytime[2]だと"火"になる。

$date = " $month月$mday日(@dayname[$wday])$hour:$min:$sec ";

# 画面に出力
print $date;
 
プログラムを実行してみてください。
X月X日(曜)X時:X分:X秒
と表示されれば成功です。