配列を編集する(splice)
splice( 配列, 開始位置, 要素数 )
use Data::Dumper;
my @a = (1 ,2, 3, 4, 5, 6, 7, 8, 9);
@array = splice( @a, 2, 2 ) # [ 3, 4 ] <= [ 1 ,2, _, _, 5, 6, 7, 8, 9 ]
# (先頭より2番目から、2つ分の要素を取り出す)
@array = splice( @a, -2, 2 ) # [ 8, 9 ] <= [ 1 ,2, 3, 4, 5, 6, 7, _, _ ]
# (後方より2番目から、2つ分の要素を取り出す)
@array = splice( @a, 2, -2 ) # [ 3, 4, 5, 6, 7 ] <= [ 1 ,2, _, _, _, _, _, 8, 9 ]
# (前方より2番目から、後方より2つ分の要素までを取り出す)
# 開始位置=(先頭より2+1つ目) 要素数=(後方より2+1つ目)
@array = splice( @a, -2, -2 ) # 操作失敗(※範囲が正しくない)
※取り出したデータは返り値となり、取り出されたデータは取り出し元から削除される。
ケース1
配列の内容を別の配列に移動してみる。
my @b = splice(@a); # @aの要素を全て@bへ移動
print "[\@a]\n".Dumper(@a)."\n";
print "[\@b]\n".Dumper(@b)."\n";
結果
[@a] # コピー元(空になっている)
[@b] # コピー先
$VAR1 = 1;
$VAR2 = 2;
$VAR3 = 3;
$VAR4 = 4;
$VAR5 = 5;
$VAR6 = 6;
$VAR7 = 7;
$VAR8 = 8;
$VAR9 = 9;
ケース2
一部データを抜き出し別の配列に移動する。
my @a = splice(@b, 0, 5); # 前方より4番目,5個分をデータを取り出す
print "[\@a]\n".Dumper(@a)."\n";
print "[\@b]\n".Dumper(@b)."\n";
結果
[@a]
$VAR1 = 1;
$VAR2 = 2;
$VAR3 = 3;
$VAR4 = 4;
$VAR5 = 5;
[@b]
$VAR1 = 6;
$VAR2 = 7;
$VAR3 = 8;
$VAR4 = 9;