前節でリストと配列の作り方を学んだので、ここでは配列の要素にアクセスする方法を見ていきましょう。
前節でも使った
@array = ("can", 43, "masa", 81, "hide", 69);
という配列を考えましょう。 この@array配列の最初の要素にアクセスするには次のようにします。
$array[0];
このように、$の後に配列名、その後にアクセスしたい要素のインデクスをブラケット[ ]で囲んで書きます。 配列のインデクスは0から始まることに注意してください。 また配列名の先頭は@ではなく$です。 このことは「配列の個々の要素はスカラーである」ことを思い出せば理解していただけると思います。
同様に、
$array[1];
$array[2];
とすると他の要素へもアクセス出来ます。 またインデクスには変数や式も使えますので、
$index = 2;
$array[$index]; #$array[2]と同じ
$array[2*$index - 1]; #$array[3]と同じ
とすると、$array[2]、また$array[3]にアクセスしたのと同じになります。 更にチョットびっくりですが、インデクスには負の数も入れることが出来ます。 例えば、
$array[-1]; #@arrayの一番最後の要素にアクセス
とすると、@arrayの一番最後の要素69にアクセスできます。 このように負の数を指定すると、後ろから数えた要素にアクセスします。
$array[-2];
#@arrayの後ろから2番目の要素にアクセス
$array[-3];
#@arrayの後ろから3番目の要素にアクセス
また、文字列canにアクセスするのに、
("can", 43, "masa", 81, "hide", 69)[0];
としてもかまいません。 後の章で登場する関数の中には、リスト値を返す物もあり、その中の特定の値だけが必要な場合に上のような書き方が使われます。
次に、配列に値を代入するには。
$array[2] = "katsu";
のように代入演算子を使います。 上の場合@array配列の3番目の要素に文字列katsuを代入します。 なので@array配列は、
@array = ("can", 43, "katsu", 81, "hide", 69);
となります。 他にも、第2章で取り上げたほとんどの演算子は、配列の要素に対しても使用できます。 以下に使用例を示します。
$array[1] += 4; #$array[1]を47に変更
$array[3] -= 2; #$array[3]を79に変更
$array[0] x= 2; #$array[0]をcancanに変更
ここで配列のサイズよりも大きなインデクスを指定した場合、Perlは自動的に配列のサイズを拡張してくれます。例えば、
$array[8] = "tsuyo";
とすると、
@array = ("can", 43, "katsu", 81, "hide", 69, undef,
undef, "tsuyo");
となります。 定義されていない要素(上の場合$array[6], $array[7])は未定義(undef)となります。
@array配列の3番目と5番目の要素を入れかえるにはどうすればいいでしょうか? まず思いつくのは、
@array = ($array[0], $array[1], $array[4],
$array[3], $array[2], $array[5]);
とする方法ですが、これは効率的ではないですよね? そこで登場するのが「スライス」です。 上と同じことをスライスを使って書くと、
@array[2, 4] = @array[4, 2];
となります。 また前節で出てきたlocaltime関数を使って、年月日だけを表示するときには、
($mday, $mon, $year) = (localtime(time))[3, 4, 5];
のように書きます。
このように、配列の中の複数の要素にアクセスするのに用いられるのがスライスです。 スライスを用いるときには先頭の文字は$ではなく@です。 混乱しないように気をつけてください。
スライスにはスカラー変数の値や配列も使用できます。
@y = (2, 0, 1);
$z = 2;
@array[$z, 0, 1]; #@array[2, 0, 1]と同じ
@array[@y]; #上のスライスの別表記
では、$a[0]と書くところを間違えて@a[0]と書いてしまったらどうなるのでしょうか? これもスライスとして解釈されます。 $a[0]という1つだけの要素を持つリストと同じです。
チョット難しいですが、この辺はじっくりと考えて理解して欲しいと思います。 後はやはり「実験と思考錯誤」ですね。 次の節では、配列を操作する関数について見て行きます。