0、配列とリスト | ||
要素(element)配列を構成する要素は、それぞれがスカラー値を持つスカラー変数になっている。この要素は順序づけされていて、最初から最後まで特定の順番に並んでいる。 リスト(list)とは、スカラーデータに順序を付けて並べたもの。 配列(array)とは、リストを保持する変数のこと。 |
||
1、リストリテラル | ||
リストリテラル(list literal)は、プログラム中でリストの値を記述するための表記法で、値をカンマで区切って並べてかっこで囲んだもの。これらの値がリストを構成する要素となる。 |
||
( 1 , 2 , 3 ) ( "fred" , 4.5 ) |
3つの値 1 , 2 , 3 からなるリスト 2つの値 "fred" , 4.5 からなるリスト |
|
リストの要素は式を使うこともできる。式を使った場合、リテラルが使われるたびに式が新たに評価される。 |
||
( $a ,17 ) ( $a + $b , $c + $d ) |
2つの値 現在の$aの値 , 17 からなるリスト 2つの値からなるリスト |
|
リスト構成演算子(list constructor operator)とは、2個のスカラー値の間にピリオドを2個連続しておいたもの。左のスカラー値から右のスカラー値までの範囲で、1ずつ増加する値のリストを生成する。 |
||
( 1 .. 5 ) ( 1.2 .. 5.2 ) ( 2 .. 6 , 10 , 12 ) ( $a .. $b ) |
( 1 , 2 , 3 , 4 , 5 ) と同じ ( 1 , 2 , 3 , 4 , 5 ) と同じ ( 2 , 3 , 4 , 5 , 6 , 10 , 12 ) と同じ 現在の $a と $b の値によって、範囲が決まる。 |
クォートワード(quote word)とは、文字列(空白以外)をリストリテラルへ記述する際に使えるショートカット |
||
@girls = ( "lucy" , "nancy" , "angie" , "sarah") ; @girls = qw( lucy nancy angie sarah ); |
これはかなり面倒だが、、、 このように書けば同じ結果が得られる |
2、配列変数 | ||
配列変数(array variable)は、リスト値(0個以上のスカラー値)を1個保持する。配列変数に付ける名前はスカラー変数とにているが先頭の文字 $ の代わりにアットマーク @ を使用する。 例えば、配列変数 @angie はスカラー変数 $angie とは何の関係もなく、Perlは異なる型のデータごとに、別の名前空間を持っている。 式の中では、配列変数を配列全体として利用するほかに、配列個々の要素の値を参照したりすることができる。 |
3、配列演算子と配列関数 | ||
配列関数(array function)と 配列演算子(array operator)は、配列全体に対して作用する。これらのうち、いくつかのものはリストを返し、返されたリストは、さらに別の配列関数で処理したり、配列変数に代入したりすることができる。 |
||
配列代入演算子(array assignment operator)は、スカラーの代入演算子と同様に、イコール記号1個で表される。代入の対象がスカラー変数か配列変数かに応じて、スカラー代入を行うか配列代入を行うかが決まる。 |
||
@sarah = ( 1 , 2 , 3 ) ; @july = @sarah ; |
配列 @sarah に3要素のリテラルを代入する そして、その配列を @july に複写する |
|
スカラー値を配列変数に代入すると、そのスカラー値1個だけを要素とする配列になる。 |
||
@sarah = 1 ; |
数値1は自動的に「1」のというリストに変換される。 |
配列変数名は、リストリテラルの中で使うことが可能。Perl はリストの値を評価するときに、変数名をその時点の配列の値で置き換える。 |
||
@sarah = qw ( one two ) ; @july = ( 4 , 5 , @sarah , 6 , 7 ) ; @july = ( 8 , @july ) ; @july = ( @july , "ten" ) ; |
配列 @july は( 4 , 5 , "one" , "two" , 6 , 7 )になる @july の先頭に8を挿入 @july の最後に"ten"を追加 @july は( 8 , 4 , 5 , "one" , "two" , 6 , 7 , "ten" )となる |
|
式ではなく変数のみからなるリストリテラルは、あたかも変数であるかのように扱うことが可能。そのようなリストリテラルは代入の左辺に置くことができ、リストリテラル中の各スカラー変数は、右辺のリスト中の対応する値を受け取る。 |
||
( $a , $b , $c ) = ( 1 , 2 , 3 ) ; ( $a , $b ) = ( $b , $a ) ; ( $d , @lucy ) = ( $a , $b , $c ) ; |
$a に1を、$b に2を、$c に3を代入 $a と $b を入れ替える $d に $a を代入、@lucy に $b と$c を代入 |
|
代入の対象になる変数の個数と値の個数が一致しない場合には(イコールの右側の)値が余れば勝手にそれらを捨てる。また、(イコールの左側)変数が余れば、「undef」をセットする。 |
||
@lucy = ( $1 , $2 , $3 ) ; ( $e , @lucy ) = @lucy ; |
$e には$1が代入、@lucy は( $2 , $3 ) の配列に変化する |
|
< 左辺にリストリテラルの中に配列変数を含める場合は、リストの最後に置かないと残りの要素を独り占めするので注意 > |
||
配列変数をスカラー変数に代入すると、配列の要素の個数がセットされる。 |
||
@lucy = ( 4 , 5 , 6 ) ; $a = @lucy ; |
だとすれば、、、 $a は配列 @lucy の要素数である「3」になる |
|
ただし、次のようにすると配列代入として扱うことも可能。 |
||
( $a ) = @lucy ; |
こうすれば @lucy の最初の要素「4」が代入されて残りの要素は捨てられる |
|
連続して代入するには、、、 |
||
@lucy = @betty = ( 1 , 2 , 3 ) ; @lucy = ( @betty = ( 1 , 2 , 3 ) ) ; |
これで配列 @lucy と @betty に ( 1 , 2 , 3 ) が代入できる もちろんこれでも OK |
4、配列要素のアクセス | ||
添え字(index) とは、配列に代入されている要素を取り出し参照するための指定数字。決められた順番で代入されている要素を最初から数えて何番目かで添え字を指定するが Perl は Unix 等と同じくゼロ「0」から数えるので注意。 |
||
@angie = ( 7 , 8 , 9 ) ; $a = $angie [ 0 ] ; $angie [ 0 ] = 5 ; |
$a に7 ( @angie の最初の要素 )を代入する 要素を指定して代入することも可能 @angie は ( 5 , 8 ,9 ) となる |
|
配列の要素を選んでアクセスする時は、スカラー変数として扱われるので $angie [ 0 ] となる。 @ ではなく $ になるので要注意。 |
||
$c = $angie [ 1 ] ; $angie [ 2 ] ++ ; $angie [ 1 ] += 4 ; |
$c は8になる @angie の3番目の要素に1を加える 2番目の要素に4を加える |
スライス(slice)とは、同一の配列に含まれる複数の要素にアクセスすることを言う。スライスは頻繁に用いられるので、下記のような専用の書き方がある。 |
||
@sarah [ 0 , 1 ] ; @sarah [ 0 , 1 ] = @sarah [ 1 , 0 ] ; @sarah [ 0 , 1 , 2 ] = @sarah [ 1 , 1 , 1 ] ; @sarah [ 1 , 2 ] = ( 9 , 10 ) ; |
( $sarah [ 0 ] , $sarah [ 1 ] )と同じ事 要素の順を入れ替える 3つの要素全てを2番目の要素と同じ値にする 2~3番目の要素を 9 , 10 にする |
|
スライスの場合は、配列の一部を配列変数をして扱うので先頭文字は $ ではなく @ になるので注意。 スライスはリテラルリストやリスト値を返す演算子に対しても有効。 |
||
@act = ( qw ( in , out , go , let ) ) [ 2 , 3 ] ; @move = qw ( in , out , go , let ) ; |
@act = @move [ 2 , 3 ] ; となる |
|
インデックス値は整数の定数だけではなく数を返す式でもインデックスにすることができる。 |
||
@nuncy = ( 7 , 8 , 9 ) ; $a = 2 ; $b = $nuncy [ $a ] ; $c = $nuncy [ $a - 1 ] ; ( $c ) = ( 7 , 8 , 9 ) [ $a - 1 ] ; |
$nuncy [ 2 ]と同じ事なので9を代入 $c には $nuncy [ 1 ] の8が代入される スライスを使っても同じ結果が得られる |
スライスの場合も添え字に式を使うことができる。 スライスの添え字はリストでないといけないのでスカラー式の代わりに配列式を使うこと |
||
@nuncy = ( 7 , 8 , 9 ) ; @a = ( 2 , 1 , 0 ) ; @x = @nuncy [ @a ] ; |
@nuncy [ 2 , 1 , 0 ] や ($nuncy [ 2 ] , $nuncy [ 1 ] , $nuncy [ 0 ] )と同じ |
|
存在しない要素にアクセスすると undef を返す。 |
||
@nuncy = ( 7 , 8 , 9 ) ; $x = @nuncy [ 5 ] ; |
$x は undef になる |
|
現在の配列の末尾を超えて要素に値をセットすると配列は自動的に拡張されるがその間の要素には undef がセットされる |
||
@nuncy = ( 1 , 2 , 3 ) ; $nuncy [ 3 ] = "girl" ; $nuncy [ 6 ] = "pretty" ; |
@nuncy は ( 1 , 2 , 3 , "girl" )となる @nuncy は ( 1 , 2 , 3 , "girl" , undef , undef , "pretty" )となる |
「#」を使うと配列の最後のインデックス値を返す。 |
||
@zoo = ( "lion" , "tiger" , "wolf" , "jaguar" ) ; print $#zoo ; print $zoo [ $#zoo ] ; |
3を表示 "jaguar" を表示 |
|
「ー」を使うと配列の要素を最後から数える。 |
||
@zoo = ( "lion" , "tiger" , "wolf" , "jaguar" ) ; print $zoo [ -1 ] ; print $zoo [ -2 ] ; |
"juguar" を表示 "wolf" を表示 |
|
ここではゼロ「0」をカウントに入れないので注意(なんでだろ?) |
||
push 関数と pop 関数 push 関数は配列の右端要素(最も大きな添え字を持つ要素)に対してスカラー変数や値のリストを追加することができる。 |
||
push ( @sarah , $nick ) ; @list = ( 1 , 2 , 3 ) ; push ( @list , 4 , 5 , 6 ) ; |
@sarah = ( @sarah , $nick ) と同じ @list = ( 1 , 2 , 3 , 4 , 5 , 6 ) リストを受け取ることもできる |
|
あくまでも要素の最後に追加するものなので、引数の初めは配列変数名であることが必須 | ||
pop 関数は配列の右端要素(最も大きな添え字を持つ要素)を取り除く。 | ||
@list = ( 3 , 4 , 5 ) ; $data = pop ( @list ) ; |
$data は 5 になり @list は ( 3 , 4 ) となる |
|
unshift 関数と shift 関数 unshift 関数は配列の左端要素(最も小さな添え字を持つ要素)に対してスカラー変数や値のリストを追加することができる。 |
||
unshift ( @sarah , $nick ) ; @list = ( 1 , 2 , 3 ) ; unshift ( @list , 4 , 5 , 6 ) ; |
@sarah = ( $nick , @sarah ) と同じ @list = (4 , 5 , 6 , 1 , 2 , 3 ) リストを受け取ることもできる |
|
shift 関数は配列の左端要素(最も小さな添え字を持つ要素)を取り除く。 |
||
@list = ( 3 , 4 , 5 ) ; $data = shift ( @list ) ; |
$data は 3 になり @list は ( 4 , 5 ) となる |
reverse 関数は引数として渡されたリストの要素を、逆順に並べたものを返す。 |
||
@list = ( 1 , 2 , 3 ) ; @a = reverse ( @list ) ; @list = reverse ( @list ) ; |
@a は ( 3 , 2 , 1 ) となる この関数はリストそのものを変更するのではないので逆順のリストが必要ならこのように格納の式が必要になる |
sort 関数は引数乗りストを受け取って、そのリストの各要素を文字列と見なしソートして返す。reverse関数と同じく元のリストそのものは変更しない。 |
||
@list = sort ( "small" , "medium" , "large" ) ; @a = ( 1 , 2 , 16 , 24 , 8 , 31 ) ; @a = sort ( @a ) ; |
@list は "large" , "medium" , "small" となる @a は 1 ,16 , 2 , 24 , 31 , 8 となる。数値のリストを受け取っても文字列としてソートする |
chomp 関数はスカラー変数同様、配列変数にも使用可能。渡された配列の全ての要素から末尾にあるレコードセパレータ「\n」を取り除く。 |
||
@angie = ( "A\n" , "B" , "C\n" , "D" ) ; chomp ( @angie ) ; |
@angie は ( "A" , "B" , "C" , "D" ) となる |
5、スカラー & リストコンテキスト |
スカラーコンテキスト(scalar context)&リストコンテキスト(list context) 演算子や関数は、予め定められた組み合わせでスカラーやリストを受け取りスカラーかリストを返すように設計されている。通常はこの違いはあまり意味を持たないが、場合によってはスカラーコンテキストかリストコンテキストかにより異なった処理が行われる。 |
||
@angie = ( "A" , "B" , "C" , "D" ) ; $word = @angie ; ( $word ) = @angie ; |
$word は要素数の 4 を返す。 $word は初めの要素 "A" を返し、残りを捨てる |
6、配列を文字列中に展開する |
配列値も、スカラーと同じように、ダブルクォート文字列の中に変数展開することができる。 |
||
@angie = ( "A" , "B" , "C" , "D" ) ; $y = 2 ; $x = "Here come $angie[ 1 ]'s place" ; $x = "Here come $angie[ $y - 1 ]'s place" ; |
"Here come B's place" 上と同じ結果 |
|
単なるスカラー変数の直後にブラケット「 [ 」を置くときには、配列要素と解釈されないために下記のようにする。 |
||
@angie = ( "A" , "B" , "C" , "D" ) ; $angie = "right" ; $x = "Here come $angie[ 1 ]" ; $x = "Here come ${angie}[ 1 ]" ; $x = "Here come $angie" . "[ 1 ]" ; $x = "Here come $angie\[ 1 ] ; |
"Here come B" 誤り "Here come right[ 1 ] 正解 "Here come right[ 1 ] 正解 "Here come right[ 1 ] 正解 |
|
配列変数から取り出した値のリストを展開することも可能。最も簡単なのは配列全体の展開で、配列名(先頭に @ を付ける)を指定するだけで展開できる。(この場合、配列の要素は間にスペースを挟んで順番に展開される) |
||
@angie = ( "A" , "BB" , "CCC" , 1 , 2 , 3 ) ; $a = "Now for @angie here" ; $b = "Now for @angie[ 2 , 3 ] here" ; $c = "Now for @angie[ @angie[ 4 , 5 ] ] here" ; |
"Now for A BB CCC 1 2 3 here" "Now for CCC 1 here" "Now for CCC 1 here" 上と同じ |