列表可以傳遞給子程式

至於將列表傳遞到子例程,你可以指定子例程的名稱,然後將列表提供給它:

test_subroutine( 'item1', 'item2' );
test_subroutine  'item1', 'item2';     # same

內部 Perl 為這些引數建立別名並將它們放入陣列 @_ 中,該陣列在子例程中可用:

@_ =  ( 'item1', 'item2' ); # Done internally by perl

你可以像這樣訪問子例程引數:

sub test_subroutine {
    print $_[0]; # item1
    print $_[1]; # item2
}

別名使你能夠更改傳遞給子例程的引數的原始值:

sub test_subroutine {
    $_[0] +=  2;
}

my $x =  7;
test_subroutine( $x );
print $x; # 9

為防止無意中更改傳遞到子例程的原始值,你應該複製它們:

sub test_subroutine {
    my( $copy_arg1, $copy_arg2 ) =  @_;
    $copy_arg1 += 2;
}

my $x =  7;
test_subroutine $x; # in this case $copy_arg2 will have `undef` value
print $x; # 7

要測試傳遞給子例程的引數數量,請檢查 @_ 的大小

sub test_subroutine {
    print scalar @_, ' argument(s) passed into subroutine';
}

如果將陣列引數傳遞給子例程,它們將被展

my @x =  ( 1, 2, 3 );
my @y =  qw/ a b c /; # ( 'a', 'b', 'c' )
test_some_subroutine @x, 'hi', @y; # 7 argument(s) passed into subroutine
# @_ =  ( 1, 2, 3, 'hi', 'a', 'b', 'c' ) # Done internally for this call

如果你的 test_some_subroutine 包含語句 $_[4] = 'd',對於上面的呼叫,它將導致 $y[0] 之後有值 d

print "@y"; # d b c