创建子程序
通过使用关键字 sub
,后跟标识符和括在括号中的代码块来创建子例程。
你可以使用特殊变量 @_
访问参数,该变量包含所有参数作为数组。
sub function_name {
my ($arg1, $arg2, @more_args) = @_;
# ...
}
由于函数 shift
在子程序中使用时默认为移位 @_
,因此在子程序开始时将参数顺序提取到局部变量是一种常见的模式:
sub function_name {
my $arg1 = shift;
my $arg2 = shift;
my @more_args = @_;
# ...
}
# emulate named parameters (instead of positional)
sub function_name {
my %args = (arg1 => 'default', @_);
my $arg1 = delete $args{arg1};
my $arg2 = delete $args{arg2};
# ...
}
sub {
my $arg1 = shift;
# ...
}->($arg);
Version >= 5.20.0
或者,实验特征 signatures
可用于解包参数,这些参数通过值( 而不是通过引用) 传递。
use feature "signatures";
sub function_name($arg1, $arg2, @more_args) {
# ...
}
默认值可用于参数。
use feature "signatures";
sub function_name($arg1=1, $arg2=2) {
# ...
}
你可以使用任何表达式为参数提供默认值 - 包括其他参数。
sub function_name($arg1=1, $arg2=$arg1+1) {
# ...
}
请注意,你不能引用在当前参数之后定义的参数 - 因此以下代码不能按预期工作。
sub function_name($arg1=$arg2, $arg2=1) {
print $arg1; # => <nothing>
print $arg2; # => 1
}