リストと配列の使い方

複数のスカラー(文字列・数値)データに順序をつけて並べたものものをリスト(list)といいます。

配列(array)は、リストを保持する変数です。

リストリテラル

リストリテラルは、プログラム中でリストを表記するための表記法で、値をカンマ「,」で区切って括弧「( )」で囲んだものです。リストリテラル中でリストリテラルを表記した場合には、括弧「()」を外した一つのリストと等しくなります。

(値1, 値2, ... 値n)

例 リストリテラル

(1, 2, 3) # 1,2,3の数値からなるリスト

("りんご", "みかん", 3, 5+1) # 文字列と数値と式からなるリスト

(1, , , 2) # 隙間のあるリスト

() # 空のリスト

(1, (2, 3), 4) # (1, 2, 3, 4)と同じ。二次元配列にはならない。

リスト構成演算子

リスト構成演算子(list constructor operator)を使ってリストを記述することができます。これは、2つの値の間にピリオドを2個置いたものです。2つの値で表された区間を連続する整数値のリストを表します。2つの値が昇順でなければ空リストを表します。

例 リスト構成演算子によるリストリテラル

(1 .. 3) # (1, 2, 3)と同じ

(1 .. 4, 7, 9) # (1, 2, 3, 4, 7, 9)と同じ

配列

配列の代入

配列にはリストが代入できます。スカラー値を代入しようとした場合には、スカラー値一個からなるリストが代入されます。

リストリテラルと同様に、リストリテラル中に現れる配列は要素を順番に並べた一つのリストなります。

例 配列の代入

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

@manekin_names=@names; # 配列を配列に代入

@array=1; # (1)が代入される

@array=(1,@names,2); # (1, "マイキー", "エミリー", "ローラ", 2)が代入される

スカラー変数を要素とするリストリテラルへの代入をすることも可能です。左辺に現れる各スカラー変数には対応する右辺の要素が代入されます。

例 スカラー変数要素のリストリテラルへの代入

($a, $b, $c)=("マイキー", "エミリー", "ローラ"); # 各スカラー変数に対応する要素が代入

($a, $b, $c)=@names; # 配列を代入

配列の要素の参照

作成した配列から要素を参照するには、演算子「[ ]」を使用します。配列の要素はスカラー値になるので、$から始まるところに注意してください。

$名前[式]

例 配列の要素の取り出し

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

print $names[1]; # エミリーと表示

例 配列の要素への代入

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

$names[1]="ブラウン"; # インデックス1の要素に代入

print $names[1]; # ブラウンと表示

スライス

配列の複数の要素を同時に参照することをスライスと言います。スカラー変数からなるリストリテラルでも同様になります。

配列名[式1, 式2, ... 式n]

例 スライス

@array[0,1]; # ($array[0],$array[1])と同じ。

@array[0,1] = @array[1,0]; # 要素0と要素1を入れ替え

($a, $b) = ($b, $a); # スカラー変数$a, $bの値の入れ替え

配列の長さ

$#に続けて@を除いた配列名をつけた変数は、配列の長さ-1の値をとります。すなわち、$#名前+1で配列の長さを表します。

$#名前 # 配列「@名前」の長さ-1 

$#名前+1 # 配列「@名前」の長さ 

例 配列の長さの取得

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

print $#names; # 2と表示

# 配列全てを操作
for ($i=0; $i<=$#names; $i++) { # 配列の長さだけ繰り返し
	print "$i: $names[$i]\n"; # i番目の要素を表示
}

例 配列の長さの変更

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

$#names=9; # 配列の長さが10になるように空の要素を追加

$#names=1; # 配列の長さが2になるように配列を切り詰める

print @names; # マイキーエミリー と表示

配列を扱う関数

末尾に要素を追加(push関数)

push関数は配列の末尾に要素を追加して、配列の長さを返します。

push(配列名, 引数1, 引数2, ... 引数n)

例 末尾に要素を追加

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

print push(@names, "トニー", "チャールズ"); # 5と表示

print @names; # マイキーエミリーローラトニーチャールズ と表示

先頭に要素を追加(unshift関数)

unshift関数は配列の先頭に要素を追加して、配列の長さを返します。

unshift(配列名, 引数1, 引数2, ... 引数n)

例 先頭に要素を追加

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

print unshift(@names, "トニー", "チャールズ"); # 5と表示

print @names; # トニーチャールズマイキーエミリーローラ と表示

末尾の要素を削除(pop関数)

pop関数は配列の末尾にある要素を削除して、削除した要素を返します。

pop(配列名)

例 末尾の要素を削除

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

print pop(@names); # ローラと表示

print @names; # マイキーエミリー と表示

先頭の要素を削除(shift関数)

shift関数は配列の末尾にある要素を削除して、削除した要素を返します。

shift(配列名)

例 先頭の要素の削除

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

print shift(@names); # マイキーと表示

print @names; # エミリーローラ と表示

配列の逆順(reverse関数)

reverse関数は引数のリストを逆順にした結果を返します。もとの配列の変更はしません。

reverse(配列名)

例 配列の逆順

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

print reverse(@names); # ローラエミリーマイキーと表示

print @names; # マイキーエミリーローラ と表示

配列の並べ替え(sort関数)

sort関数は引数のリストを辞書順に並び替えた結果を返します。もとの配列の変更はしません。数値も文字列として並び替えが行われます。数値として並び替えるための方法もありますが、ここでは省略します。

sort(配列名)

例 配列の並べ替え

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

print sort(@names); # エミリーマイキーローラと表示

print @names; # マイキーエミリーローラ と表示

配列要素の改行記号削除

chomp関数は配列にも使用することができます。配列に使われた場合には、配列の全要素から改行記号を削除します。

chomp(配列名)

例 配列要素の改行記号削除

@names=("マイキー\n", "エミリー\n", "ローラ\n"); # リストリテラルを配列に代入

print chomp(@names); # エミリーマイキーローラと表示

配列の要素で繰り返し

foreach文を使って配列の要素で繰り返しを行うことができます。配列の要素を順番に指定した変数に入れながら繰り返しを行います。変数名を省略すると$_という特殊な変数に要素が入ります。また、リストが配列だった場合には、変数に代入を行うともとの配列の値も変更されます。

foreach 変数名 ( リスト ) {
	ブロック
}

例 配列の要素で繰り返し

@names=("マイキー", "エミリー", "ローラ"); # リストリテラルを配列に代入

foreach $name (@names) { # 配列@namesの要素を一つずつ取り出して繰り返し
	print "私は$nameよ。いつだって$nameなのよ。\n"; # 順番に要素が表示される
}