1.配列とは
配列を構成する要素は、それぞれ独立しているため、C言語などとは異なり、数値、文字列、undefなど異なる性質の組み合わせを保持することができる(下図参照)。
また、リストには0から始まり1ずつ増えるインデックスが付いており、先頭の要素は常に0になる。
一番驚きなのは、配列の要素の個数には制限がないらしい。なので、使用可能なメモリを全て使い尽くすまで個数を増やせることになる。
2.配列の要素へのアクセス
実際に、以下のプログラムを実行してみると、
#! /usr/bin/perl
$box[0] = "123";
$box[1] = "abc";
$box[2] = 123;
print $box[0] . " " . $boc[1] . " " . $box[2];
【実行例】
このように、配列の要素は、異なる性質の値を格納しても問題なく、配列の値を取得できる。なお、配列の添え字には、数値になるようなものならばどんなものでも使用することが可能である。
たとえば、
$num = 232.3432432432;
print $box[$num -1]; #$box[231]と等しい
添え字が、配列の末尾よりも後ろにある要素を指している場合、対応する値はundefになる。
$blank = $box[ 322_23 ]; #未使用の配列要素はundefになる
$blank = $hi; #未使用のスカラー変数$hiもundefになる。
3.リストリテラル
リストリテラルとは、プログラム中でリスト値を記述するための表記法。値をコンマに区切って、( )で囲んだもの。
(1,2,3) # 3つの値からなる
() # 空のリスト
(1,2,3,) # 同じ3つの値のリストであり、最後のコンマは無視される
また、範囲演算子(..)というものがあり、この演算子は、左のスカラーから右のスカラーの範囲まで、1ずつ増加させる値のリストを生成する。
(1..4) # (1,2,3,4)と同じ
(2..1) #空のリスト。増加する方向にしか働かない
($low..$high) #$lowと$highの値により範囲が決まる。
4.qw
qwとは、文字列のリストを簡単に記述できるショートカット。
たとえば、
("taro", "masato", "himeno", "ken")
を
qw! taro masato himeno ken !
と記述できる。なお、最初の”!”を開始デミリタと言い、最後のものを終了デミリタという。文字列の中に終了デミリタと同じものがある場合には、逆スラッシュを使用する。
qw! hi! hello! !
5.リストの代入
変数に値を代入するのと同じやり方で、リストに値を代入できる。
($one, $two, $three) = ("one", "two", "three")
たとえば、価を交換したい場合には、
($one, $two) = ($two, $one)
リストの個数と代入する値の個数が異なる場合
-余った変数はundefとなる。
-値が切り捨てられる。
($one, $two) = qw[ one ]; #$twoにはundefが入る
($one, $two) = qw[ one, two, three]; #"three"は切り捨てられる
また、Perlには配列全体を表すための、より簡単な書き方を用意している。配列の前に@をつけるだけで、配列全体を表すようになる
@box = qw/ one two three /;
上記の例では、$box[0]には"one"、$box[1]には"tow"が入り、$box[2]には"three"が入ることになる。
また、配列から別の配列にコピーする際にも以下のように記述できる。
@cory = @source;
6.pop演算子とpush演算子
一般に、配列をスタックとして使用し情報を格納する方法がよく用いられている。
Perlでは、このスタックを扱うための演算子が用意されている。
配列から最後の要素を取り出して返す。なお、配列が空の場合にはundefを返す。
要素を配列の末尾に追加する。
pop演算子を使用した例を書くと以下のようになる。
@array = 2..6;
$temp1 = pop(@array); #$temp1=6となり、@arrayは(2,3,4,5)となる
$temp2 = pop @array; #$temp2=5となり、@arrayは(2,3,4)となる
また、push演算子を使用した例を書くと以下のようになる。
@array = (2,3);
push(@array, 1); #@arrayは(2,3,1)となる
push @array, 6; #@arrayは(2,3,1,6)となる
@str = 7..9;
push @array, @str; #@arrayは(2,3,1,6,7,8,9)となる
【プログラム実行例】
7.shift演算子とunshift演算子
pop演算子とpush演算子は、配列の「末尾」に対して処理する演算子である。
一方、shift演算子とunshift演算子は、配列の「先頭」に対して処理する演算子である。
@array = 2..5;
$temp1 = shift(@array); #$temp1には2が入り、@arrayは(3,4,5)
$temp2 = shift @array; #$temp2には3が入り、@arrayは(4,5)
shift @array; #@arrayには(5);
unshift(@array, 4); #@arrrayには(4,5)
@ne = 1..3;
unshift (@array, @ne); #@arrayは(1,2,3,4,5)
8.foreach制御構造
foreachループは、値のリストを受け取って、それぞれの値に対して1回ずつコードのブロックを繰り返して実行する。
foreach $temp (qw/ one two three four /) {
print $temp . "n"; #one two three fourと順に表示する
}
なお、上記例の$tempを「制御変数」という。
【実行例】
また、foreach制御構文にて制御変数を省略すると、デフォルト変数$_を使用する。
foreach (1..10) {
print $_;
}
9.reverse演算子
reverse演算子は、値のリストを受け取って、そのリストの逆順を並べたものを返す。
@array = 3..6;
@rev1 = reverse @array; #@rev1は(6,5,4,3)になる
@rev2 = reverse 1..10; #@rev2は(10,9,...,2,1)となる
10.sort演算子
sort演算子は、値のリストを受け取って、それを内部の文字順に従ってソートする。
@str = qw/ one two three four /;
@sort = sort(@str); #frour, one, three, twoとなる
12.スカラーコンテクストとリストコンテクスト
Perlが式を解析する際には、コンテクスト、つまり式がどんな場所におかれているかによって、スカラー値かリスト値を決定する。たとえば、
5 + blackbox; # $blackboxはスカラーでなければならない
sort balckbox; # $blackboxはリストでなければならない
また、スカラーコンテキストでは、下図で示すように、配列に格納する要素の数を返す場合もある。
@some = qw/ taro hanako jiro /;
@sort = sort @some; #リストコンテキスト:jiro、hanako、taroとなる
$num = @sort; #スカラーコンテキスト:$numは3となる
なお、強制的にスカラーコンテキストを強制したい場合には、scaler関数を使用する。
@meibo = qw/ hanako taro ken /;
print "Number of menber: " . scalar @meibo . "n";