配列の宣言と基本的な使い方

Perl で配列を使用するには配列を宣言します。宣言した配列に対しては各要素に値を格納したり、逆に要素から値を取り出すことができるようになります。ここでは Perl における配列の宣言と配列の基本的な使い方について解説します。

(Last modified: )

配列とは

配列の使い方を確認する前に、配列を使うとどのようなことができるのかについて簡単に確認しておきます。次の例を見て下さい。

my ($seiseki1, $seiseki2, $seiseki3);
$seiseki1 = 80;
$seiseki2 = 75;
$seiseki3 = 69;

print "$seiseki1\n";
print "$seiseki2\n";
print "$seiseki3\n";

3 人分の成績を格納するために変数を 3 つ用意して、それぞれの変数に値を格納しています。変数は値を一つしか格納できないので、例えば 100 人分の成績を保管するには 100 個の変数が必要となります。

このように同じような目的で使用される複数の値を管理する場合は配列を使うと便利です。配列は値を格納することができる要素を複数持つことができ、配列の中では複数の要素はインデックスと呼ばれる数値を使って区別されています。先ほどの例を配列を使って書き直すと次のようになります。

my @seiseki;
$seiseki[0] = 80;
$seiseki[1] = 75;
$seiseki[2] = 69;

print "$seiseki[0]\n";
print "$seiseki[1]\n";
print "$seiseki[2]\n";

配列変数の @seiseki を宣言したあと、配列の要素に対して値を順に格納していきます。変数毎に値を格納する代わりに、配列変数[インデックス]に対して値を格納しています。

配列は各要素は数値のインデックスで区別できるため、先ほどの例は繰り返し処理の for 文などと組み合わせることで次のように書き換えることができます。

my @seiseki;
$seiseki[0] = 80;
$seiseki[1] = 75;
$seiseki[2] = 69;

for (my $i = 0; $i < 3; $i++){
  print "$seiseki[$i]\n";
}

変数名を別々に用意した場合は、各変数に対して 1 つ 1 つ処理を記述していくしかありませんが、配列を使った場合にはインデックス部分は数値として扱えますので繰り返し処理を組み合わせることで簡潔に処理が行うことができます。上記の例で言えば必要となる変数の数が 100 個になった場合でも、 for 文の条件式を 3 から 100 に変更するだけで済みます。

まったく別の目的で使用される複数の変数を配列としてまとめても意味はありませんが、今回のように同じ目的で複数の記憶領域が必要になるような場合には配列は大変便利です。

配列を宣言する

変数の場合と同じく配列を使用する場合にも最初に宣言を行います。変数の場合はプレフィックス名として $ を使用しましたが、配列の場合は @ を使用して次のように宣言してください。

@配列名

例えば配列名として name を使った配列を宣言する場合は次のようになります。

my @name;

配列では値を要素に格納します。配列は複数の要素を管理することができるので、結果として複数の値を格納することができます。プログラミング言語によっては配列を宣言する時にいくつの要素を使うのか指定しなければならないものもありますが、 Perl の配列では、宣言するときに要素の数を指定する必要はありません。要素数は自動的に拡張されたり縮小されたりします。

配列の要素へ値を格納する

配列では要素に対して値を格納します。配列には要素を複数持っていますが、それぞれの要素はインデックスと呼ばれる数値を使って区別します。配列に含まれる最初の要素のインデックスは 0 で、次の要素は 1 と続いていきます。

配列の要素を指定するには配列名のあとの [] の間にインデックスを指定して次のように記述します。

配列名[0]
配列名[1]
配列名[2]

配列の一つ一つの要素は変数と同じ扱いです。要素に対して値を格納するには次のように記述します。

$配列名[インデックス] = 値;

配列を宣言するときにプレフィックスは @ でしたが、配列の要素のプレフィックスは変数と同じく $ である点に注意してください。

次の例を見てください。

my @seiseki;
$seiseki[0] = 80;
$seiseki[1] = 75;

配列 @seiseki を宣言したあと、配列の 0 番目の要素に 80 、 1 番目の要素に 75 を格納しています。

要素に格納されている値を取得する方法も変数と同じです。次の例を見てください。

my @seiseki;
$seiseki[0] = 80;
$seiseki[1] = 75;

print $seiseki[0]."\n";
print $seiseki[1]."\n";

要素に格納した値を取り出し、画面に出力します。今回の場合は 80 と 75 が出力されます。

配列の要素の自動拡張

Perl では配列を宣言するときに要素数を指定しません。必要に応じて要素を自動的に拡張します。下記の例では 3 つの要素に値を格納しているため、自動的に要素は 3 つ用意されます。

my @seiseki;
$seiseki[0] = 80;
$seiseki[1] = 75;
$seiseki[2] = 65;

では連続していないインデックスを指定した場合はどうなるのでしょうか。次の例ではインデックスとして 2 を指定した要素に値を格納したあと、次にインデックスとして 5 を指定した要素に値を格納しています。

my @seiseki;
$seiseki[0] = 80;
$seiseki[1] = 75;
$seiseki[2] = 65;
$seiseki[5] = 92;

この記述自体はエラーではありません。この場合、インデックスが 5 の要素が用意され 92 が格納されます。ただし要素はインデックスに合わせて先頭から順に用意されていきます。インデックスが 2 の要素のあとにインデックスが 5 の要素を使用すると、自動的にインデックスが 3 と 4 の要素も用意されます。

このようにして自動的に作成された要素は初期化されていませんので要素の値は変数の場合と同じく未定義値 undef となります。

サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my @seiseki;
$seiseki[0] = 80;
$seiseki[1] = 75;
$seiseki[2] = 69;
$seiseki[5] = 91;

for (my $i = 0; $i < 6; $i++){
  if (defined($seiseki[$i])){
    print "[$i] = $seiseki[$i]\n";
  }else{
    print "[$i] = undef\n";
  }
}

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

配列の宣言と基本的な使い方(1)

配列を宣言したあと、インデックス 0, 1, 2, 5 の要素に対して値を格納し、そのあとでインデックス 0 から 5 まで順番に要素から値を取得して画面に出力しています。格納されている値が undef かどうかの判定のために defined 関数を使用しています。

-- --

Perl における配列の宣言と配列の基本的な使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。