『初めての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); # エラー

コメントを残す

コメントを残す