配列の操作
■この章で解説する組み込み関数
push, pop, unshift, shift, splice
■この章でできること
・配列の末尾に要素を追加する
・配列の末尾から要素を削除する
・配列の先頭に要素を追加する
・配列の先頭から要素を削除する
・配列の部分要素を削除する
・配列の部分要素を置換する
・配列の要素をトランケートする

 配列への要素の追加や要素の削除をするためにいくつか関数が用意されています。まず、配列の末尾に要素を追加、末尾から要素を削除するには、push、pop関数を使います。これらを使うと配列でスタックを実現できます。また、配列の先頭への要素の追加、先頭からの要素の削除にはunshift、shift関数を使います。そして、任意位置の要素の削除にはsplice関数を使います。

 説明するよりも、サンプルを見たほうが分かりやすいでしょう。以下がそのサンプルです。

#!/usr/bin/perl

#############################################
# 配列操作のサンプル
# produced by "Perl Programming Tips"
#############################################

@array = ("aaa", "bbb", "ccc", "ddd");

# push
print "before push    : @array\n";
print "push return    : " . push(@array, ("eee", "fff")) . "\n";
print "after push     : @array\n\n";

# pop
print "before pop     : @array\n";
print "pop return     : " . pop(@array) . "\n";
print "after pop      : @array\n\n";

# unshift
print "before unshift : @array\n";
print "unshift return : " . unshift(@array, ("eee", "fff")) . "\n";
print "after unshift  : @array\n\n";

# shift
print "before shift   : @array\n";
print "shift return   : " . shift(@array) . "\n";
print "after shift    : @array\n\n";

# splice (remove)
print "before splice  : @array\n";
print "splice return  : " . splice(@array, 3, 2) . "\n";
print "after splice   : @array\n\n";

# splice (replace)
print "before splice  : @array\n";
print "splice return  : " . splice(@array, 2, 1, ("ggg", "hhh")) . "\n";
print "after splice   : @array\n\n";

# splice (truncate)
print "before splice  : @array\n";
print "splice return  : " . splice(@array, 3) . "\n";
print "after splice   : @array\n\n";

 実行結果は次のようになります。

[g@630m pl]$ perl array_01_01.pl
before push    : aaa bbb ccc ddd
push return    : 6
after push     : aaa bbb ccc ddd eee fff

before pop     : aaa bbb ccc ddd eee fff
pop return     : fff
after pop      : aaa bbb ccc ddd eee

before unshift : aaa bbb ccc ddd eee
unshift return : 7
after unshift  : eee fff aaa bbb ccc ddd eee

before shift   : eee fff aaa bbb ccc ddd eee
shift return   : eee
after shift    : fff aaa bbb ccc ddd eee

before splice  : fff aaa bbb ccc ddd eee
splice return  : ddd
after splice   : fff aaa bbb eee

before splice  : fff aaa bbb eee
splice return  : bbb
after splice   : fff aaa ggg hhh eee

before splice  : fff aaa ggg hhh eee
splice return  : eee
after splice   : fff aaa ggg

[g@630m pl]$

 それぞれの関数の実行前後の配列の変化と、関数の戻り値を出力しています。では、1つずつ見ていきましょう。まずはpush関数です。push関数は配列の末尾に1つの要素またはリストを追加し、追加後の配列の長さを返します。

push
配列の末尾に要素を追加する。
書式
push @array, list
引数
@array:
追加対象の配列
list:
追加する要素
戻り値
追加後の配列の長さ

 次はpop関数です。こちらは配列の末尾から要素を1つ削除して、その要素を返します。

pop
配列の末尾から要素を削除する。
書式
pop @array
引数
@array:
削除対象の配列
戻り値
削除した要素。要素が1つもない場合、未定義値。

 次はunshift関数です。unshift関数は配列の先頭に1つの要素またはリストを追加し、追加後の配列の長さを返します。こちらはpushと違って、追加したことによって、もともとあった配列要素の添え字がずれることに注意する必要があります。

unshift
配列の先頭に要素を追加する。
書式
unshift @array, list
引数
@array:
追加対象の配列
list:
追加する要素
戻り値
追加後の配列の長さ

 次はshift関数です。shift関数は配列の先頭から要素を1つ削除して、その要素を返します。こちらもpopと違って、削除したことによって、もともとあった配列要素の添え字が1つずつずれることになります。

shift
配列の先頭から要素を削除する。
書式
shift @array
引数
@array:
削除対象の配列
戻り値
削除した要素。要素が1つもない場合、未定義値。

 次は配列の任意位置の要素の削除です。これはsplice関数を使います。

splice
配列の要素を削除する。
書式
splice @array, pos, [n], [list]
引数
@array:
削除対象の配列
pos:
削除開始する位置(配列のインデックス)
n:
削除する要素数。省略した場合は配列の最後まで削除される。
list:
指定した場合、削除した要素を指定したリストで置き換える。
戻り値
削除した要素

 splice関数の第2引数には削除を開始する位置(最初の要素を0とした配列のインデックス)を指定します。第3引数を省略すると、配列の最後までの要素が削除されます。これを使うと、配列の任意位置からのトランケートができます。また、第4引数にリストを指定すると、指定したリストで配列の部分要素を置換することができます。