『初めてのPerl』第4章 サブルーチン

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