まくまくPerlノート
配列に要素を追加する/取り出す
2008-02-28

配列の末尾/先頭への要素の追加と削除

配列に対して push, pop, shift, unshift などのメソッドを使用すると、要素を追加したり取り出したりすることができます。

配列の末尾/先頭への要素の追加

push @arr, 10;         # 配列の末尾へ 10 を追加
unshift @arr, 10;      # 配列の先頭へ 10 を追加

配列の末尾/先頭からの要素の取り出し

my $val = pop @arr;    # 配列の末尾から要素を 1 つ取り出す
my $val = shift @arr;  # 配列の先頭から要素を 1 つ取り出す

pushunshift で追加する要素は、リストコンテキストで評価されるため、リストの要素をまとめて追加することができます。

my @arr = (1, 2, 3);
push @arr, (4, 5, 6);  # @arr の値は (1, 2, 3, 4, 5, 6)

pop あるいは shift するときに配列が空の場合、undef が得られます。

インデックス指定による部分配列の取得/置換

splice を使用すると、配列の一部を取り出したり、置換したりすることができます。

例: 指定した位置(第2引数)から、指定した数(第3引数)の要素を削除する

@arr1 = ('1', '2', '3', '4', '5');
@arr2 = splice(@arr1, 2, 2);  # @arr1 = ('3', '4'), @arr1 = ('1', '2', '5')

第3引数を省略すると、 末尾までの要素を削除します。

@arr1 = ('1', '2', '3', '4', '5');
@arr2 = splice(@arr1, 2);  # @arr2 = ('3', '4', '5'), @arr1 = ('1', '2')

第2引数に負の値を指定すると、後ろから数えたインデックスで指定することができます。 例えば、次のスクリプトはファイルの末尾 10 行を表示します(UNIX の tail コマンドと同じ動作をするスクリプトです)。

@lines = <>;
print splice(@lines, -10);

第4引数以降に任意の要素を指定しておくと、削除した要素の位置に新しく挿入されます。 次の例では、配列に ‘abc’ という要素を挿入しています(要素の削除数は0と指定しているので、置換ではなく、挿入となります)。

@arr = ('1', '2', '3', '4');
splice(@arr, 2, 0, 'abc');  # @arr = ('1', '2', 'abc', '3', '4')
2008-02-28