構文 |
|
sub サブルーチン名; sub サブルーチン名(プロトタイプ); sub サブルーチン名 : アトリビュート; sub サブルーチン名(プロトタイプ) : アトリビュート; sub サブルーチン名 処理ブロック sub サブルーチン名(プロトタイプ) 処理ブロック sub サブルーチン名 : アトリビュート 処理ブロック sub サブルーチン名(プロトタイプ) : アトリビュート 処理ブロック sub 処理ブロック; sub (プロトタイプ) 処理ブロック; sub : アトリビュート 処理ブロック; sub (プロトタイプ) : アトリビュート 処理ブロック; |
返り値 |
|
サブルーチン名省略時に無名関数 |
説明
- サブルーチンを定義します。
- 処理ブロックを省略すると先行宣言になります。
- サブルーチン名を省略すると無名関数を返します。
使用例
#!/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;
}
#!/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"; # 引数があわないのでエラーになる
#!/usr/bin/perl
use strict;
use warnings;
sub foo; # 先行宣言
foo 100; # 先行宣言がない場合はエラーになる
sub foo {
my $val = shift;
print "val=[$val]\n";
}
#!/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);
}