- 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); # エラー