PR
 
関数順 インデックス
目的別 インデックス

構文
 
 sub サブルーチン名;
 sub サブルーチン名(プロトタイプ);
 sub サブルーチン名 : アトリビュート;
 sub サブルーチン名(プロトタイプ) : アトリビュート;
 sub サブルーチン名 処理ブロック
 sub サブルーチン名(プロトタイプ) 処理ブロック
 sub サブルーチン名 : アトリビュート 処理ブロック
 sub サブルーチン名(プロトタイプ) : アトリビュート 処理ブロック
 sub 処理ブロック;
 sub (プロトタイプ) 処理ブロック;
 sub : アトリビュート 処理ブロック;
 sub (プロトタイプ) : アトリビュート 処理ブロック;

返り値
 
 サブルーチン名省略時に無名関数

説明

  • サブルーチンを定義します。
  • 処理ブロックを省略すると先行宣言になります。
  • サブルーチン名を省略すると無名関数を返します。

使用例

リストの最大値を返すサブルーチンmaxを定義して呼び出す
#!/usr/bin/perl
use strict;
use warnings;

my @data = (43, 1, 30, 111, 50);

print max(@data), "\n";

sub max {
  my $val = shift;
  my @items = @_;
  
  foreach my $item (@items) {
    $val = $item if $val < $item;
  }
  
  return $val;
}
スカラー値を二つ取るサブルーチンmaxを定義して呼び出す
#!/usr/bin/perl
use strict;
use warnings;

sub max($$) { # スカラー値を二つ取る
  my $val1 = shift;
  my $val2 = shift;
  
  return ($val1 > $val2) ? $val1 : $val2;
}

print max(10, 5), "\n";
#print max(10, 5, 100), "\n"; # 引数があわないのでエラーになる
※プロトタイプを指定すると引数の型を強制することができます。 ※引数の型の強制が有効なのはfunc($val)形式で呼び出す場合だけで,&func($val)や$obj->func($val)等の場合は型のチェックは行われません

サブルーチンfooの先行宣言をして,あとで本体を定義する
#!/usr/bin/perl
use strict;
use warnings;

sub foo; # 先行宣言

foo 100; # 先行宣言がない場合はエラーになる

sub foo {
  my $val = shift;
  print "val=[$val]\n";
}
※先行宣言をするとサブルーチンの定義が行われる前でも括弧を省略してサブルーチンを呼び出すことができます。

ハッシュのリファレンス$funcの要素+,-,*に対してそれぞれ無名関数を定義し,配列@itemsの要素内の値に応じて無名関数を実行する
#!/usr/bin/perl
use strict;
use warnings;

my $func = {
  '+' => sub {my ($v1, $v2) = @_; return $v1 + $v2},
  '-' => sub {my ($v1, $v2) = @_; return $v1 - $v2},
  '*' => sub {my ($v1, $v2) = @_; return $v1 * $v2},
};

my @items = (
  '10+5',
  '10-5',
  '10*5',
);

foreach my $item (@items) {
  my ($v1, $op, $v2) = split /([+\-*])/, $item;
  printf "%s=%d\n", $item, $func->{$op}($v1, $v2);
}
※サブルーチン名を省略すると無名関数を取得することができます。