§3.4 配列操作の達人


作成日:2001/07/06(金)

前節では、pushやpopなど、配列を操作するための基本的な関数を紹介してきました。 ここでは配列操作のエキスパート、splice関数についてお話します。

push、pop、shift、unshiftの4つの関数は、配列の末尾や先頭について操作を行う物でした。 splice関数は、配列の任意の場所に、任意の数の要素を追加、削除する物です。 splice関数は次のようにして呼び出します。

 splice(@array, offset, length, value, ...);

上のようにして呼び出すと、@arrayのインデクスがoffsetの要素から、length個の要素を削除して、そのあとのvalueに置き換えます。 ですから例えば、

 @array = ("can", 43, "masa", 81, "hide", 69);

という配列に対して、

 splice(@array, 2, 2, "katsu", 49, "tsuyo", 77);

としてsplice関数を呼び出すと、@array配列のインデクス2の要素、つまり$array[2]の"masa"から2個の要素を削除して、そこへ"katsu", 49, "tsuyo", 77の4要素を挿入します。 ですから呼び出した後の結果は、

 @array = ("can", 43, "katsu", 49, 
   "tsuyo", 77, "hide", 69);

となります。要素の削除、追加によって、配列の長さは自動的に変化します。今の場合、2個の要素を削除して4個の要素を追加するので、@array配列の長さは2つ伸びています。 splice関数がどのような動作をするのかじっくりみてください。

splice関数を使って、要素の挿入、削除だけを行うことも出来ます。

 splice(@array, 2, 0, "toshi", 58);
のように、lengthの部分を0にすると、offsetで指定した要素の直前に要素を挿入します。 上の例だと、$array[2]の直前に"toshi", 58という2つの要素を挿入します。
また要素を削除するだけの場合は、

 splice(@array, 2, 2);

のように、一番後ろのvalueの部分を空にします。 今の場合$array[2]と$array[3]が削除されます。 さらに、

 splice(@array, 2);

のようにlengthの部分も省略するとoffsetで指定した位置以降の要素を全て削除してくれます。

offsetやlengthに負の値をセットするとどうなるのでしょうか? まずOFFSETに負の値をセットすると、配列の後ろから数えて-offset番目の要素を指定したことになります。 例えば、

 splice(@array, -2, 2);

とすると、@arrayの最後の2つの要素を削除したことになります。
 またlengthの部分に負の値をセットすると、配列の後ろから数えて-length個の要素を除いた部分を指定したことになります。 例えば、

 @array = ("can", 43, "masa", 81, "hide", 69);
 splice(@array, 2, -2);

とすると、まず$array[2]から先が対象になります。 そしてlengthが-2となっているので、@array配列の最後の2つ、つまり$array[4]と$array[5]の2つは対象外となります。 よって、$array[2]と$array[3]が削除されることになります。

さて、前節で扱ったpush、pop、shift、unshiftの4つの関数を、splice関数を使って書いてみましょう。 まずこれら4つの関数の動作を表にすると次のようになります。

要素を追加 要素を削除
末尾に push pop
先頭に unshift shift

これらの関数をsplice関数をつかって書くと、

 push(@array, $x, $y); 
   → splice(@array, scalar(@array), 0, $x, $y);

 pop(@array);
   → splice(@array, -1, 1); #最後の1は省略可

 unshift(@array, $x, $y);
   → splice(@array, 0, 0, $x, $y);

 shift(@array);
   → splice(@array, 0, 1);

のようになります。 ここでscalar関数が初登場しましたが、これは配列の要素数を取ってきてくれる関数です。

さて、ここでは配列操作の達人についてお話しました。 splice関数の動作は1度見ただけではなかなかわかりません(それは僕だけかな)。 いろいろと実験してみてください。 次の節では「コンテキスト」という概念について見て行きます。


「§3.3 配列を操作する」へ 「§3.5 コンテキスト」へ
ソフトバンク パブリッシング株式会社

Copyright (C) can All Rights Reserved
e-mail:ishiki@mrj.biglobe.ne.jp