Hatena::ブログ(Diary)

もうカツ丼でいいよな このページをアンテナに追加 RSSフィード Twitter

2009 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 12 |
2012 | 02 | 03 | 04 | 05 | 06 | 10 | 11 | 12 |
2013 | 01 | 02 | 04 | 06 |
2014 | 06 |

2013-02-05

[][] 4. サブルーチン 23:20  4. サブルーチンを含むブックマーク  4. サブルーチンのブックマークコメント

初めてのPerl 第6版メモ。割と練習問題躓く。

  • subroutine:ユーザーが定義した関数。
  • サブルーチンの名前:Perl識別子の頭に&。省略できる場合とできない場合がある。名前空間は独立している。

4.1 サブルーチンを定義する

sub hoge {
    ...
}
  • 定義はどこにおいても構わない。
  • 後ろにあるものは前にあるものを上書きする。
  • サブルーチン本体の中では全てのグローバル変数を扱える。

4.2 サブルーチンを起動する

&hoge;
  • 起動する(invoke)ことを呼び出す(call)と呼ぶ場合が多い。

4.3 戻り値

  • サブルーチンの中で最後に評価された計算の結果は自動的に戻り値になる。
  • 計算の結果が返り値として使われず捨てられる場合、無効コンテキスト(void context)警告メッセージが出る。

4.4 引数

&hoge(fuga, piyo);
  • 引数はリストとして渡され、@_に格納される。
  • サブルーチン内部の@_はプライベートなものである。
  • 余ったパラメータは単に無視される。

4.5 サブルーチン内でプライベートな変数

  • my演算子はレキシカル変数(lexical variable)を作り出す。
  • レキシカル変数はそれを取り囲むブロックにスコープを持つ。

4.7 レキシカル変数(my変数)についての注意事項

  • レキシカル変数はあらゆるブロックの中で使える。
  • レキシカル変数の名前のスコープはそれを取り囲むもっとも小さいブロックまたはファイルに限定される。
  • my演算子は代入のコンテキストを変えない。
  • 括弧を伴わないmy演算子はレキシカル変数を1個しか宣言できない。括弧があれば複数同時に宣言できる。
  • 新しい変数はundefまたは空リストとなる。
  • 制御変数をレキシカル変数にすることもできる。
foreach my $hoge {
    ...
}

4.8 use strictプラグマ

  • pragma:コンパイラに与えるコードの扱いに関するヒント。
  • use strictプラグマは良いコーディングルールを強制する。
  • Perl 5.12以降ではプラグマでバージョン指定をするとuse strictプラグマも指定される。
  • use strictプラグマを宣言するとすべての変数はmy演算子などを使って宣言することが強制される。

4.9 return演算子

  • return演算子はサブルーチンから即座に値を返す。
4.9.1 アンパーサンドを省略する
  • 次の場合にはアンパーサンドを省略できる。
    • コンパイラがサブルーチン呼び出しの前に定義を見ている。
    • 構文からサブルーチン呼び出しであることが分かる。
      • 括弧で囲んでパラメータリストを指定した場合
  • アンパーサンドなしでサブルーチンを呼び出した場合に、同名の組み込み関数があればそちらが優先される。

4.10 スカラー以外の返り値

  • リストコンテキストで呼び出したサブルーチンは値のリストを返すこともできる。
  • 引数なしのreturnはスカラーコンテキストではundef、リストコンテキストでは空リストを返す。

4.11 永続的なプライベート変数

  • stateで宣言した変数はサブルーチンをスコープに持ち、さらに値を保持し続ける。
sub hoge {
    state $fuga = 0;
    ...
}
  • stateによる宣言文は2回目以降の呼び出しでは無視される。
  • 配列とハッシュをリストコンテキストで初期化することはできない(少なくともPerl 5.14の時点では)。
トラックバック - http://d.hatena.ne.jp/Rion778/20130205/1360074016