配列は複数の値を格納でき、数値をインデックスにしてアクセスできるデータ型です。
配列を宣言するには、変数の先頭に@を付けます。空の配列を宣言するには以下のようにします。
my @array;
配列の宣言時にリストで初期化することができます。
my @array = ("foo", "bar", "baz");
配列の値を取得するには配列に[ ]を付けます。インデックスは0で始まります。
my $value = @array[0];
また、変数とインデックスの間にドットを入れることもできます。
my $value = @array.[0];
配列に値を格納する場合は以下のようにします。
@array[0] = "hoge";
配列のインデックスにコンマ区切りの値を指定するとスライスになり、複数の値を取得することができます。
my @values = @array[2, 0, 1]; my @values = ( @array[2], @array[0], @array[1] ); # 同じこと
また、リストや配列を指定することも可能です。
my @values = @array[(2, 0, 1)]; my @slice = (2, 0, 1); my @values = @array[@slice];
@array.shift()shift(@array)配列の先頭の値を削除し、削除された値を返します。配列の要素数が1つ小さくなります。
@array.unshift(list)unshift(@array, list)配列の先頭に値を追加します。配列の要素数は必要に応じて拡張されます。
@array.pop()pop(@array)配列の最後の値を削除し、削除された値を返します。配列の要素数が1つ小さくなります。
@array.push(list)push(@array, list)配列の最後に値を追加します。配列の要素数は必要に応じて拡張されます。
@array.splice(start, num)splice(@array, start, num)startで指定されたインデックスを開始点としてnum個の要素を削除し、削除された値を返します。
my @array = ("foo", "bar", "baz"); my @deleted = splice @array, 1, 1; # "bar"を削除
numを省略した場合はstart以降の値が全て削除されます。
my @array = ("foo", "bar", "baz"); my @deleted = splice @array, 1; # "bar", "baz"を削除
startとnumを省略した場合は配列の全要素が削除されます。
my @deleted = splice @array;
@array.keys()keys(@array)配列のキーをリストとして返します。
@array.values()values(@array)配列の値をリストとして返します。
@array.kv()kv(@array)キーと値のリストを返します。
@array.pairs()pairs(@array)キーと値をペアのリストとして返します。
@array.elems()配列の要素数を返します。
@array.exists(num)指定されたインデックスの値が存在すれば真を返します。
@array.delete(num)指定されたインデックスの値を削除し、削除された値を返します。インデックスを複数指定することもできます。
@array.delete(0, 2); # 複数の値を削除
@array.max()配列に含まれる値の最大値を返します。
@array.min()配列に含まれる値の最小値を返します。
@array.pick(num)配列の中の値をnum個だけランダムに取り出します。
my @array = <a b c d>; @array.pick(); # "a"か"b"か"c"か"d"
numが配列の要素数を超えている場合、返される値の個数は配列の要素数になります。:replオプションを指定するとその制限が無くなり、numに指定した個数だけ値を返します。
my @array = <z z>; @array.pick(2); # ("z", "z") @array.pick(3); # ("z", "z") @array.pick(3, :repl) # ("z", "z", "z")
numに*を指定すると配列の値をランダムに並べ替えたリストを返します。
@array.pick(*); # ("d", "a", "b", "c")など
reduce(block, @array)最初に配列の先頭2つの値をblockで処理し、その結果と3つ目の値をblockで処理し、その結果と4つ目の値をblockで処理し・・・を最後まで繰り返します。
my @array = <5 -3 7 0 1 -9>; my $sum = 5 + -3 + 7 + 0 + 1 + -9; # 1 my $tmp = 5; $tmp = $tmp + -3; $tmp = $tmp + 7; $tmp = $tmp + 0; $tmp = $tmp + 1; $tmp = $tmp + -9; # 上記と同じことを行う reduce { $^a + $^b }, @array; # 1 # 3つ以上も可 reduce { $^a + $^b + $^c }, @array;
@array.first(block)配列に含まれる値の中で、最初にblockが真になる値を返します。
my @array = (1 .. 10); my $result = @array.first( { ($_ == 4) } ); # 4
grep(block, @array)配列に含まれる値の中で、blockが真になる値を返します。以下の例では奇数の値を返します。
my @array = (1 .. 10); my @result = grep { ($_ % 2) }, @array;
map(block, @array)配列の値をblockで処理したリストを返します。grepと違い、結果の真偽値は問いません。
# 全ての値を2倍にする my @array = (1 .. 10); my @result = map { $_ * 2 }, @array;
@array.join(sep)配列の値をsepで挟んで結合した文字列を返します。sepを省略した場合は空白文字が使われます。
my @array = ("a", "b", "c"); @array.join("|"); # "a|b|c" @array.join(); # "a b c"