3. リストと配列

初めてのPerl 第6版メモ。5版を(中途半端に)読んだの大分昔だけど思ったより覚えてる。

  • リスト(list):スカラーの集合に順序を付けて並べたもの。
  • 配列(array):リストを格納する変数。
  • 配列のindexは0オリジン。

3.1 配列の要素にアクセスする

  • $hoge[0]
  • ここで$hogeというスカラー変数があっても全く問題ない。
  • 添字は切り捨てにより丸められる。
  • 末尾より後ろの要素を指すとundefになる。

3.2 配列の特殊なインデクス

  • 末尾より後ろの要素に値を入れると自動的に拡張される。
  • 最後の要素のインデクスは$#hoge
  • 負のインデクスは末尾から先頭へ数える。-1で最後の要素。要素数を超える範囲を負のインデクスで指定するとエラー。

3.3 リストリテラル

  • ("括弧で", "くくって", "コンマで", "区切る")
  • 範囲演算子:(1..3)→(1, 2, 3)。小数は切り捨て後に評価。増加のみ。
  • 要素が式の場合、リテラルが使われる度に評価される。
3.3.1 qwショートカット
  • qw( 単語の リストを 作る場合に クォートが 不要 )
  • デリミタは任意の文字記号や括弧っぽいもの((), {}, [], <>)が使える。

3.4 リスト代入

  • ($hoge, $huga) = qw(リストへ まとめて代入できる)
  • 右辺リストは先に評価される。
  • 右辺が多すぎる場合は切り捨て、少なすぎる場合はundefで穴埋め。
  • 「配列全て」は@マークをつけて表す。(@rray)
  • 配列を配列の要素にすると要素になった配列は展開される。
  • undefを値として持つ変数はundefの要素にはならず単に無視される。undefはundef演算子で明示的に入れることができる。

3.5 pop演算子とpush演算子

  • pop:配列の最後の要素を取り除き、値としてそれを返す。配列が空の時はundefが返る。
  • push:配列の末尾に要素または配列を追加する。
3.5.1 shift演算子とunshitf演算子
  • shift:配列の先頭の要素を取り除き、値としてそれを返す。配列が空の時はundefが返る。
  • unshift:配列の先頭に要素または配列を追加する。

3.6 splice演算子

  • 指定の範囲を取り除き、取り除いた範囲を返す
    • 添字3以降の要素全て:splice @array, 3;
    • 添字3から2つの範囲:splice @array, 3, 2;
    • 取り除いた後を指定の要素で置き換え:splice @array, 3, 2, 1..3;
      • 置き換えリストの長さは一致してなくてもよい。
      • 範囲として0を指定すると指定位置に挿入する。

3.7 配列を文字列の中に展開する

  • 要素はスペースで区切って展開される。
  • Emailアドレスを記述した場合は注意!

3.8 foreach制御構造

foreach $hoge (@fuga){
    print $hoge;
}
  • 制御変数の値はループの度に変わる。
  • 制御変数はリストの要素そのものであり、制御変数への変更はリスト要素への変更である。
  • ループが終わると制御変数の値はループ開始前の値に戻る。
3.8.1 Perlお気に入りのデフォルト:$_
  • 制御変数を省略すると制御変数として$_が採用される。
    • その他の多くの場面でも変数を省略すると$_が使われる。(e.g. print;)
3.8.2 reverse演算子
  • 逆順にしたリストを返す。リストそのものは変更しない。
3.8.3 sort演算子
  • リストを文字としてソートする。リストそのものは変更しない。
  • 順序はコードポイントに従う。
3.8.4 each演算子
  • Perl 5.12以降
  • eachを配列に適用する度に次の要素のインデクスと要素を返す。

3.9 スカラーコンテキストとリストコンテキスト

  • Perlでは式は常にコンテキストに応じた値を返す。
    • @list = @people # @peopleというリストが代入される
    • $n = @people # @peopleというリストの要素数が代入される
3.9.1 リストを生成する式をスカラーコンテキストで使う
  • 式により異なる。
    • sort:undef
    • reverse:逆転した文字列
3.9.2 スカラーを生成する式をリストコンテキストで使う
  • リスト値を持たない式であれば、1要素のリストになる。
3.9.3 スカラーコンテキストを強制する
  • 擬似関数scalarを用いる。

3.10 リストコンテキストでを使う

  • 残りすべての行を読み込み、各行を要素として持つリストを返す。
  • キーボードからの入力の場合、Unixの類はCtrl+dをファイルの終わりとみなす。WindowsではCtrl+Z。
  • chompは配列に対しても作用し、各要素から最後の改行を取り除く。