建立子程式

通過使用關鍵字 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
}