- Perlでは、ユーザーが定義した関数のことをサブルーチン(subroutine)と呼ぶ
- サブルーチンの名前には、頭にアンパーサンド(&)をつける(省略してもコードの意味が変わらない場合には、省略できる)
- サブルーチンはファイル内のどこで定義してもよい(プロトタイプに関する例外はある)
- サブルーチンのスコープは原則としてグローバル
- 同じ名前のサブルーチン定義が2個あると、後ろにあるものが前のものを上書きする(use warningsをつければ検出可能)
- use strict をつけると未定義変数の使用等に警告が出る。
- プラグマで最低限必要なバージョンとして5.12以降を指定すると、暗黙のうちにstrictプラグマも有効になる
サブルーチンの中で最後に行われた計算の結果が、自動的に戻り値になる:
#!/usr/bin/env perl use v5.12; use warnings; sub two { 1 + 1; } say &two; # 2
サブルーチンに与えた引数は、$_[0], $_[1], … といった変数に格納される(配列@_からも引数を取り出せる):
#!/usr/bin/env perl use v5.12; use warnings; sub max { if ($_[0] > $_[1]) { $_[0]; } else { $_[1]; } } say max(1, 2); # 2 say max(1); # Use of uninitialized value in numeric gt (>) say max(1, 2, 3); # 2(警告無し)
変数名の前にmyをつけることで、レキシカル変数を作れる。レキシカル変数のスコープはブロック内のみ。
#!/usr/bin/env perl use v5.12; use warnings; sub max { my ($m, $n) = @_; if ($m > $n) { $m } else { $n } } say max(1, 2); # 2
可変長引数:
#!/usr/bin/env perl use v5.12; use warnings; sub max { my ($max_so_far) = shift @_; # 最初の引数を暫定版の最大値とする foreach (@_) { # 残りの引数を暫定版の最大値と比較する if ($_ > $max_so_far) { $max_so_far = $_; } } $max_so_far; } say &max(2, 7, 5, -1); # 7
stateで永続的なプレイベート変数を定義する(PHPでいうstatic):
#!/usr/bin/env perl use v5.12; use warnings; sub inc { state $n = 0; $n += 1; say $n; } inc; # 1 inc; # 2 inc; # 3
配列・ハッシュをstate変数として使う場合は、リストコンテキストでの初期化ができない
state @array = qw(a b c); # エラー