星になれたなら

つみあげログです

「初めてのPerl」2章 スカラーデータ を読む

2章 スカラーデータ

この章でわかること

読んでいく

オーディオコメンタリー方式で、言いたいこと、補足があるぶぶんだけ書いていきます。

  • スカラー Scalar
  • 数値
    • Perl での数値の扱い方(精度、サイズ)は Perl ビルド時の環境に依存する
      • C のライブラリを使っているらしい
      • どのように扱い方が選択される?
    • 整数、小数や、その底によらず、内部的には倍精度浮動小数点(double)
      • 常に丸め誤差がありうる
        • 値がいくつかを判定するときは微小値で挟み込んだほうがいいのだろうか?
          • ε << 1 のとき n-ε < x < n+ε ならば x = n のような
    • リテラル
      • 整数リテラル
        • アンダースコアで区切ることが可能
        • 2進整数リテラル 0b11111111 = 255
        • 8進整数リテラル 0377 = 255
        • 16進整数リテラル 0xFF = 255
        • ただし、文字列を整数にキャストする際は、明示的に指定しない限り10進整数扱い
      • 小数リテラル
        • e記法が可能
          • 16進のときは意味的に衝突してしまうため、 p で表記
    • 数値演算子
      • 四則演算に加えて %** がある
  • 文字列
    • (文字列って配列じゃないんですね、参照なのかな、値なのかな)
    • どんなバイナリも突っ込めるので、画像なんかも一旦文字列として格納するらしい
    • Unicodeリテラルを扱いたい場合は utf8 プラグマを使う
    • リテラル
      • Single-quoted string literal
        • シングルクォートとバクスラのみエスケープが効く
        • 改行できる
      • Double-quoted string literal
        • バクスラでたいていのエスケープシーケンスや、hexadecimal octal を使ったコードポイントの指定ができる
          • \x{2668} => :hotsprings: (Unicode Codepoint)
          • \x7f => 削除文字 (ASCII Code)
        • 変数展開 variable interplation ができる
      • 文字列演算子
        • . … 結合
        • x … 右オペランド回文字列を繰り返す。繰り返し回数は端数切捨て
        • 数値演算子を文字列に対して適用すると数値にパースしようとするので、演算子が分けられている
      • パース
        • hex('0xBEEF') / oct('0377') で 文字列 を n 進数でパースできる
        • prefix なしでも n 進数と認識される
          • なぜか oct は10進以外のあらゆる n 進数をパースする
        • 数値リテラルを渡すと文字列にキャストされてからパースされる
          • hex(10) = 16
  • スカラー変数
    • sigil … $ @ % のこと
      • 対象の変数の扱い方を決定する記号
    • ひとつの値(Scalar Value)を格納するもの
  • if control structure
    • いわゆる if 文のこと
    • curly brace が必須
  • 行入力演算子
    • <STDIN>
  • chomp
    • 引数に指定された文字列の末尾に改行文字があればそれを削除する
  • 未定義値
    • 未定義の変数にアクセスすると undef が得られる
    • 状況に応じて数値の 0 、文字列の '' に解釈される
      • どちらも falsy
    • 未定義の変数に演算を行うことで、暗黙的に宣言することができる
    • undef だけを分岐したいときは defined を使う
    • 変数に代入するとその場でメモリが解放される
  • 警告
    • warnings pragma
      • warnings を出すようになる
        • 12fred34 のような文字列を数値として扱おうとしたときなど
    • diagnostics pragma
      • warnings に加え、詳細な説明を出すようになる
      • stack trace も出る
      • プロセスの起動が若干遅くなる

補足事項です。

  • pragma
  • スコープ
    • レキシカルスコープでの変数宣言 my
      • lexical … 修辞的な
        • 書いた場所ベースでスコープが変化する、という程度の意味
    • パッケージレベルでグローバルな変数の宣言 our
      • local パッケージ変数を一時的に上書きする
        • mylocal の違い?
          • local では処理がスコープの外に出るまで、一時的に変数を読み替える(変数自体は同じもので、値だけが異なる)らしい
            • サブルーチンA 内で、 local な変数を宣言してサブルーチン Bを呼び出したときに、B 内でもA内で定義された値が使われる、というレキシカルではない挙動をする
          • https://perldoc.jp/docs/perl/strict.pod
    • グローバル
      • 修飾子なしでの変数宣言
    • サブルーチンのスコープ
      • サブルーチンはスコープの影響を受けない
        • 定義された時点でシンボルテーブルに載るため
        • スコープを持たせる場合はレキシカル変数に無名サブルーチンを格納すればよい
          • 処理がスコープ外に出ると、無名サブルーチンの リファレンスが 解放される
          • 無名サブルーチン自体は、無名なままシンボルテーブルに載る

生まれた疑問点

ここでは特になかったです。

おわりに

スカラーデータが紹介されました。 これが何かを本質的に知るには、スカラーではないデータは何か、を知る必要がありそうです。 次章以降に期待しましょう。

また、数値と文字列とで利用する演算子が異なるのは、プログラミング言語では珍しい気がします。 これでバグを埋め込んでしまわないように気をつけないとですね。