地球ウォーカー2

Scala, Python の勉強日記

初めてのPerl その3(4章)

前回の続き。
例によって、まとめ内の注釈は間違っている可能性あり。

4章 サブルーチン

  • サブルーチン名は、「&Perl識別子」で表す。
  • サブルーチンの定義
sub f {
  # do something...
}
  • 呼び出すには、サブルーチン名を書けばいい。
    • &f;
戻り値
  • 最後に評価される式が戻り値になる。
# $aと$bの大きい方が戻り値
sub max {
  if ($a > $b) {
    $a;
  } else {
    $b;
  }
}
引数
  • 配列変数@_に格納される*1
    • 引数は、$_[0]$_[1]・・・に格納される。
  • 余った引数は無視され、足りないパラメータはundefになる*2
レキシカル変数
sub max {
  my($a, $b);     # サブルーチン用のプライベートな変数
  ($a, $b) = @_;  # パラメータに名前を付ける
  if ($a > $b) {
    $a;
  } else {
    $b;
  }
}
より良い書き方
sub max {
  # プライベート変数に引数をセット
  my($a, $b) = @_;
  # コードが単純でブロックが1行に収まる場合に限って
  # 最後のセミコロンを省くのが普通
  if ($a > $b) { $a } else {$b } 
}
local演算子について
  • あとで読む*4
可変長引数
  • 引数のチェック
    • @_のサイズを調べることで可能。
    • 実世界のPerlプログラミングではあまり使うことはない。
    • サブルーチンをパラメータに適応させる方が好ましい。
  • 改良版の&max
$maximum = &max(3, 5, 10, 4, 6);

sub max {
  my($max_so_far) = shift @_;
  foreach (@_) {
    if ($_ > $max_so_far) {
      $max_so_far = $_;
    }
  }
  $max_so_far;
}
レキシカル変数についての注意事項
  • スコープはブロックレベル。
  • my演算子は、代入のコンテキストを変えない。
# リストコンテキスト、($num) = @_; と同じ
# 最初のパラメータが代入される
my($num) = @_;

# スカラーコンテキスト、 $num = @_; と同じ
# パラメータの個数が代入される
my $num  = @_;
use strictプラグマ
  • プラグマとは、コーディングに関してコンパイラに与えるヒント*5
  • 変数をmyで宣言することを強要させたりとか。
  • 詳しくはperldoc strictで。
return演算子
  • 戻り値を返し処理を終了する。
  • return;とした場合、空の値を返す。
    • スカラーコンテキストではundef
    • リストコンテキストでは、空リストを返す。
  • 空の値を返すことを明示的に示したい場合、return ();とする。
アンパサンドを省略してサブルーチンを呼び出す場合
  • 同名の組込関数が優先して呼び出される。
  • サブルーチンの起動よりも後ろで、サブルーチンを宣言してはいけない。

本日は

ここまで。

初めてのPerl
初めてのPerl
posted with amazlet at 09.09.14
ランダル・L. シュワルツ トム フェニックス
オライリージャパン
売り上げランキング: 13789

*1:JavaScriptのargumentsオブジェクト的な。

*2:このへんもJavaScriptと同じ。

*3:my使わないとグローバル変数になるのは、JavaScriptっぽい。ただし、Perlのスコープは関数レベルだけど

*4:本書に、初めて読む時は飛ばしてください、と書いてあるので。

*5:Javaアノテーション的な。