列表可以传递给子程序
至于将列表传递到子例程,你可以指定子例程的名称,然后将列表提供给它:
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