Perl:Sub的论点解释

ark*_*mvm 0 perl arguments function shift

在perl中所有sub的参数写入@_数组,如下所示:

call_any_sub($a,$b,$c);
sub call_any_sub {
  my $s_a = shift;
  my $s_b = shift;
  my $s_c = shift;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想将数组作为参数传递给sub,我应该使用:

call_any_sub(@data_array);
sub call_any_sub {
  my @data = @_;
}
Run Code Online (Sandbox Code Playgroud)

而不是类似的:

call_any_sub(@data_array);
sub call_any_sub {
  my @data = shift;
}
Run Code Online (Sandbox Code Playgroud)

那么,为什么@data_array会替换参数数组而不是写入(正如预期的那样)?

ike*_*ami 6

人们只能将一个标量列表传递给子程序(这就是他们可以返回的全部内容).毕竟,参数作为array(@_)呈现给sub ,而数组只能包含标量.

您可以(低效率)在sub中重新创建数组

 sub foo {
    my @bars = @_;
    say for @bars;
 }

 foo(@bars);
Run Code Online (Sandbox Code Playgroud)

或者您可以传递对数组的引用

 sub foo {
    my ($bars) = @_;
    say for @$bars;
 }

 foo(\@bars);
Run Code Online (Sandbox Code Playgroud)