さて、前回は配列の個々の要素、あるいは複数の要素を参照したり、値を代入することを見てきました。 ここでは配列そのものを操作する関数をいくつか紹介します。
まず配列の末尾へ新たに値を追加することを考えましょう。 前節までで見てきたことを使っても、
@array = (@array, $value);
とすれば、@array配列の末尾に$valueの値を追加することも出来ます。 しかしPerlにはpushという関数が用意されています。 前節でも使った、
@array = ("can", 43, "masa", 81, "hide", 69);
の最後に、"katsu", 49, "tsuyo", 77という4つの要素を追加するには、
push(@array, "katsu", 49, "tsuyo", 77);
と書きます。 このようにpush関数は、
push(@array, list);
という書き方によって、@arrayの末尾にlistを追加します。 もちろんlistにはスカラー変数や配列も使えるので、
push(@array, $a, $b);
push(@array, @tsuika);
という書き方もOKです。 配列の長さは追加した要素の個数分だけ増えます。またpush関数は、要素を追加した後の配列の要素数を戻り値(後の章参照)として返すので、
$length = push(@array, "katsu", 49, "tsuyo", 77);
とすると、$lengthには10が代入されます。
次に、配列の最後の要素を取り除くには、pop関数を用います。
pop(@array);
とすると、@array配列の最後の要素が取り除かれます。 またpop関数は取り除いた最後の要素を戻り値として返すので、
$last_data = pop(@array);
とすると、@array配列の最後の要素を$last_dataに代入することが出来ます。
このpushとpopという2つの関数は、配列をスタックとして扱う基本的な関数です。 ここでスタックとはデータのリストのことで、新しいデータはスタックの最後に追加され、値を取り出すときはスタックの最後から取り出します。 このスタックは時々、セルフサービスの喫茶店などの積みあがったトレーにたとえられます。 そして1つ1つのトレーがデータです。 喫茶店に入ると、積みあがったトレーの一番上の物を取って使います。 そして喫茶店を出るときは使い終わったトレーをまた一番上に戻します。 ねっ、似てるでしょ?
さて今度は配列の先頭に対しての操作を取り上げます。 配列の先頭へ要素を追加するには、
@array = ("toshi", 58, "yoshiki", "X", @array);
とすることもできますが、Perlにはunshift関数が用意されています。 書き方はpush関数とまったく同じで、
unshift(@array, "toshi", 58, "yoshiki", "X");
のようにします。 追加する要素にはスカラー変数や配列も使用できます。 配列の長さは追加した要素の個数分だけ増え、追加前の要素のインデクスも、追加した要素の個数分だけずれます。また、これもpush関数と同じで、追加した後の要素数を戻り値として返すので、
$length = unshift(@array, "toshi", 58, "yoshiki", "X");
とすると、$lengthには10が代入されます。
配列の最初の要素を取り除くには、
($first_data, @array) = @array;
とすることも可能ですが、shift関数を使うことも出来ます。
shift(@array);
とすると@array配列の最初の要素が除かれます。 またpop関数同様、取り除いた最初の要素を戻り値として返すので、
$first_data = shift(@array);
とすると$first_dataに@array配列の最初の要素が代入されます。
配列を逆さにする - reverse関数 -
reverse関数は配列のコピーを受け取って、その順番を逆にします。 受け取るのはあくまでコピーなので、配列のもとの順番は変わりません。
@yarra = reverse(@array);
配列の順番を維持したくないときには、reverse関数で逆さにした物をまた@array配列に代入します。
@array = reverse(@array);
reverse関数は、掲示板の記事を古い順ではなく、新しい順に表示するときなどに用います。
ソート(並べ替え)する - sort関数 -
sort関数は配列の要素をASCIIコード昇順にソート(並べ替え)します。
@array = ("masa", "can", "katsu", "toshi");
@sorted = sort(@array);
#@sorted = ("can", "katsu", "masa", "toshi")となる
数値からなるリストをソートするときは注意が必要です。 (13, 4, 28, 7, 58)をソートすると(13, 28, 4, 58, 7)となります。
この節では配列を操作する関数についてみてきました。 次の節では配列操作のエキスパート、splice関数について見て行きます。