配列

配列

配列について

変数には1つの値しか保存できませんが、配列を使用すれば複数の値を保存することができます。変数とは異なり、似た種類のデータをひとまとめにして扱う事ができるため、ある程度複雑な処理を行う際に便利です。

配列を作成するには、以下のように記述します。

@fruit = ("リンゴ", "ミカン", "ブドウ");

変数を作成するときは変数名の前に $ を付けましたが、配列の場合は @ を付けます。これで、fruit という配列に リンゴミカンブドウ の3つの値が保存されたことになります。
各値は、変数と同様に "' で囲んで指定します。配列は指定する値が複数指定できるので、各値を , で区切り、全体を () で囲います。

配列には、変数と同様に数値も代入できます。数値の場合は値を "' で囲う必要はないので、以下のように記述します。

@number = (2, 4, 6, 8, 9, 10);

配列には、変数を代入することもできます。変数を代入する場合は、以下のように記述します。

@var = ($sample, $test, $example);

また、配列には文字列・数値・変数を同時に代入することができます。各値を同時に代入するには以下のように記述します。

@array = ("ブドウ", 8, $sample);

配列内容の表示

以下に配列を作成してその内容を表示するプログラムを記載します。

#!/usr/local/bin/perl

@fruit = ("リンゴ", "ミカン", "ブドウ");

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>配列の内容は、$fruit[0]と$fruit[1]と$fruit[2]です。</p>\n";
print "</body>\n";
print "</html>\n";

exit;

これを実行すると、ブラウザに 配列の内容は、リンゴとミカンとブドウです。 と表示されます。

$fruit[0] は、配列 fruit の0番目の値、$fruit[1] は、配列 fruit の1番目の値…となります。配列で指定した値は、前から順番に0番目・1番目・2番目…となっています。1番目からではなく、0番目から始まるので注意が必要です。また、配列の内容を個別に参照するには、配列名の先頭には @ でなく $ を付けます。

上の例での配列 fruit の内容を表にすると、以下のようになります。

表記 意味
$fruit[0] @fruit の0番目の値 リンゴ
$fruit[1] @fruit の1番目の値 ミカン
$fruit[2] @fruit の2番目の値 ブドウ

また、以下のような代入を行う事もできます。

#!/usr/local/bin/perl

@fruit = ("リンゴ", "ミカン", "ブドウ");
($fruit_a, $fruit_b, $fruit_c) = @fruit;

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>配列の内容は、$fruit_aと$fruit_bと$fruit_cです。</p>\n";
print "</body>\n";
print "</html>\n";

exit;

これを実行すると、やはりブラウザに 配列の内容は、リンゴとミカンとブドウです。 と表示されます。

($fruit_a, $fruit_b, $fruit_c) = @fruit; の部分で、@fruit の内容を各変数に代入しています。配列の左辺にコンマ区切りで変数を並べ、全体をカッコで囲っています。そうすると、配列の先頭の値から順に各変数へ代入されます。

この場合、@fruit の0番目の値が $fruit_a へ、1番目の値が $fruit_b へ、2番目の値が $fruit_c へそれぞれ代入されます。

個別に値を格納する方法

$fruit[0]$fruit[1] とすれば、格納されている値を表示することができます。同様に、それぞれに別の内容を格納することが可能です。以下にサンプルプログラムを記載します。

#!/usr/local/bin/perl

@fruit = ("リンゴ", "ミカン", "ブドウ");

$fruit[1] = "メロン";
$fruit[5] = "イチゴ";

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>配列の内容は、$fruit[0]と$fruit[1]と$fruit[2]と$fruit[5]です。</p>\n";
print "</body>\n";
print "</html>\n";

exit;

これを実行すると、ブラウザに 配列の内容は、リンゴとメロンとブドウとイチゴです。 と表示されます。

$fruit[1] にはもともと ミカン が格納されていますが、$fruit[1] = "メロン"; の部分で新たに メロン という文字を格納しています。また、$fruit[5] の内容はもともとカラですが、$fruit[5] = "イチゴ";イチゴ という文字を格納しています。なお、$fruit[3]$fruit[4] には何も格納されていません。

配列要素数の取得

$#配列名 のようにすると、配列の添え字の最大数を取得する事ができます。添え字とは、配列の値を個別に参照するときにつける [0][1] の事です。

また、最大添え字数に1を加えたものが配列の要素数になります。具体的には、以下のようなプログラムで確認する事ができます。

#!/usr/local/bin/perl

@fruit = ("リンゴ", "ミカン", "ブドウ");

#最大添え次数を取得
$max = $#fruit;

#要素数を取得
$number = $#fruit + 1;

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>配列の最大添え字数は$maxです。</p>\n";
print "<p>配列の要素数は$numberです。</p>\n";
print "</body>\n";
print "</html>\n";

exit;

これを実行すると、ブラウザに 配列の最大添え字数は2です。配列の要素数は3です。 と表示されます。

ここまでの内容を踏まえて、商品名と価格を表示するプログラムを作成してみます。

#!/usr/local/bin/perl

@fruit = ("リンゴ", "ミカン", "ブドウ", "ナシ", "イチゴ");
@price = (100, 80, 150, 120, 200);

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>商品価格一覧。</p>\n";
print "<table border=\"1\">\n";
print "<tr>\n";
print "<th>商品名</th><th>価格</th>\n";
print "</tr>\n";

#商品名と価格を一覧表示
for ($i = 0; $i <= $#fruit; $i++) {
  print "<tr>\n";
  print "<td>$fruit[$i]</td>\n";
  print "<td>$price[$i]円</td>\n";
  print "</tr>\n";
}

print "</table>\n";
print "</body>\n";
print "</html>\n";

exit;

これを実行すると、商品名と価格が一覧表示されます。

for を使用して配列内容をすべて表示しています。$#fruit には配列の最大添え次数が格納されているので、この場合は 4 になります。つまり、$i の値は0~4が順に代入されます。

あとは、$fruit[$i]$price[$i] とすることで、配列内容を順に表示していきます。

配列制御文

配列操作を行う際の便利な制御文があります。それは『foreach制御文』です。foreach は繰り返し処理にも利用できますが、配列の要素に対して、先頭から1要素ずつ処理していくことができます。

foreach $value (@fruit) {
  print "$value<br>\n";
}

このように記述すると、@fruit の内容を先頭から順に $value に代入し、その内容に対して処理を行います。この場合、@fruit の内容を改行区切りですべて表示します。

配列操作関数

関数とは何らかの処理を行ってその結果を返すものです。数学に三角関数というものがありますが、考え方としては同じです。

一例を挙げると、Perl には lc という関数があります。これは、与えられた文字列を小文字に変換する関数です。例えば

#!/usr/local/bin/perl

$string = "PerlScript";
$string = lc($string);

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>変数の内容は、$string です。</p>\n";
print "</body>\n";
print "</html>\n";

exit;

これを実行すると、ブラウザに 変数の内容は、perlscript です。 と表示されます。$string の内容は本来は PerlScript なのですが、

$string = lc($string);

によって小文字に変換されています。関数 lc$string を渡すと、変数の内容を小文字に変換して左辺に渡します。なお、渡される値のことを引数(ひきすう)と呼びます。関数によっては引数を複数指定する場合もあり、引数が不要な場合もあります。

以下で、配列を操作する際によく使用される関数を紹介します。データを配列としてひとまとめにして管理しておくと、これらの関数を利用して効率よく処理を行う事ができます。

push

push は、配列の最後に要素を追加する関数です。

push(@fruit, $pineapple);

このように記述すると、@fruit の最後に $pineapple を追加します。

pop

pop は、配列の最後の要素を削除し、削除された要素を返す関数です。

$value = pop(@fruit);

このように記述すると、@fruit の最後の要素を削除し、その要素を $value に代入します。

unshift

unshift は、配列の先頭に要素を追加する関数です。

unshift(@fruit, $pineapple);

このように記述すると、@fruit の先頭に $pineapple を追加します。

shift

shift は、配列の先頭の要素を削除し、削除された要素を返す関数です。

$value = shift(@fruit);

このように記述すると、@fruit の先頭の要素を削除し、その要素を $value に代入します。

join

join は、配列の全要素を指定した文字で連結し、ひとつの文字列として返す関数です。

$string = join(":", @fruit);

このように記述すると、@fruit の各内容を で連結して $string に代入します。

split

split は、文字列を指定した文字で区切り、配列として返す関数です。

@fruit = split(/:/, $string);

このように記述すると、$string の内容を で区切って配列にし、@fruit に代入します。