2. スカラーデータ

初めてのPerl 第6版メモ。後で思い出せる程度に。

2.1 数値

2.1.1 すべての数値は同じ内部形式で表現される

Perlでは整数値は存在せず(内部的には使う場合があるが)、計算は倍精度浮動小数点数として行われる。

2.1.2 浮動小数リテラル 2.1.3 整数リテラル
  • 小数点の有無は関係ない。
  • 指数記法が使える。eは大文字でも小文字でもよい。
  • 可読性のためにアンダーバーを挟むことができる。10進数以外の整数リテラルでも同様。(e.g. 123_456.789_012)
2.1.4 10進数以外の整数リテラル
  • 8進数:0から始める
  • 16進数:0xから始める
  • 2進数:0bから始める
2.1.5 数値演算子
  • 四則演算:+, -, *, /
  • べき:**
  • 剰余:%

2.2 文字列

  • unicodeを使いたい:use utf8
2.2.1 シングルクォート文字列リテラル
  • バックスラッシュとシングルクォート自体はバックスラッシュでエスケープして表示する。
  • "\n"は改行記号とみなされない。
2.2.2 ダブルクォート文字列リテラル
  • 各種のバックスラッシュエスケープが使用可能
  • \n \r \t \f \b \a \e
  • ASCIIコードやUnicodeコードポイントを指定して表示できる
  • コントロール文字(C-Cは\cC)が使用可能
  • 後の1文字を小文字(\l)、大文字(\u)にできる
  • \Eまでの間のすべての文字に対し、大文字(\U)、小文字(\L)、エスケープの挿入(\Q)ができる。
2.2.3 文字列演算子
  • .:結合
  • x:繰り返し(e.g. "hello" x 3 → "hellohellohello")
    • 繰り返し回数は切り捨てによって整数に変換されてから評価される。
2.2.4 数値と文字列の自動変換
  • 演算子の種類により自動的に判断される。
  • 文字列同士に*が使われた場合、先頭から連続する数字が数値として使われる。
  • 空白文字は切り捨てられる。
  • 先頭に0があっても8進数リテラルとは判断されない。
    • e.g. "012hoge34" * " 3" → 36

2.3 Perlに組み込まれている警告メッセージ

  • 警告をさせる:use warnings;
  • コマンドラインで-wオプションでも可。
  • より詳しい警告:use diagnostics;

2.4 スカラー変数

  • $の後ろにPerl識別子を付けたもの
    • Perl識別子:英文字または下線で始まり、その後ろに英文字、数字、下線を並べたもの。大文字と小文字は区別される。
    • utf8プラグマを有効にすれば広範囲の文字を識別子に使える。
2.4.2 スカラーの代入
  • 代入は=で行う。
2.4.3 二項代入演算子

2.5 printによる出力

  • コンマで区切って複数の値を渡せる(実際にはリストである)。
2.5.1 スカラー変数を文字列の中に展開する
  • ダブルクォート文字列リテラルの中では変数展開が行われる。
  • 変数をそのままprintに渡した場合も展開される。(e.g. print $hoge, $fuga;)
  • 変数展開をしたくない場合は$をバックスラッシュでエスケープする。
  • $以降の文字列は可能な限り長い範囲が変数名として判断される。制限するにはブレースで括る。(e.g. $(hoge))
2.5.2 コードポイントで文字を生成する
  • コードポイント→文字:chr( 0x05D0 );
  • 文字→コードポイント:ord( 'א' );
  • 文字列中で直接指定:\x{03B1}
2.5.4 比較演算子
  • 文字列と数値では演算子が異なる。
  • 文字列はASCIIまたはUnicodeのソート順に従う。
数値 文字列 意味
== eq equal
!= ne net equal
< lt less than
> gt greater than
<= le less than or equal to
>= ge greater than or equal to

2.6 if制御構造

if( hoge ){
    ...
} else {
    ...
}
  • コードブロックは必ずブレースで囲むこと。

2.6.1 ブール値

  • ブール型は存在しない。
  • 数値は0のみ偽。
  • 文字列は空文字列のみ偽。
  • 否定演算子!は重ねられる。

2.7 ユーザからの入力を受け取る

  • :標準入力から次の一行を読み込んでの値として返す。
  • 通常はキーボードからの入力となり、改行を入力するまでプログラムは停止する。
  • 通常、一行は改行で終わるので改行文字を最後に含む。

2.8 chomp演算子

  • chomp():末尾の改行記号を1つ削除する。
    • 文字列そのものが変化する。
    • chomp($hoge);またはchomp $hoge;
      • 括弧は意味が変わってしまう場合以外は常に省略できる。
    • 返り値もあり、削除した改行記号の個数を返す。
  • 代入→chompは一行で書ける

2.9 while制御機構

$count = 0;
while ($count < 10) {
      $count += 2;
      ...
}

2.10 未定義値

  • undef:値が代入されるまでのスカラー変数に入っている値。
  • 数値としては0扱い。
  • 文字列としては空文字列扱い。

2.11 defined関数

  • はファイルの終わりまで読むとundefを返す。
  • defined関数:undefのとき偽、それ以外で真。
  • undef演算子:undefを返す。

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は配列に対しても作用し、各要素から最後の改行を取り除く。