创建子程序

通过使用关键字 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
}