前節では、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);
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度見ただけではなかなかわかりません(それは僕だけかな)。 いろいろと実験してみてください。 次の節では「コンテキスト」という概念について見て行きます。