不,使用如下声明:
my ($v, $foo, $bar) = @_;
$v
将分配@_
数组中的第一个值,$foo
第二个,依此类推。这是因为括号强加了一个列表上下文。任何多余的值都将被忽略,除非您的变量之一是一个数组,在这种情况下,它将吞噬所有剩余的值。
my ($v, @foo, $bar) = @_; # wrong! $bar will never get any value
$v
将获得第一个值,@foo
其余的。$bar
将是未定义的。
您可能正在考虑使用列表进行分配:
my $v = qw(a b c);
但这是错误的,并且会导致错误:
Useless use of a constant (a) in void context at -e line 1.
Useless use of a constant (b) in void context at -e line 1.
这是因为 LHS 使用标量上下文,它将(或多或少)类似于:
'a';
'b';
my $v = 'c';
您可能会注意到,如果我们通过$v
在括号内添加列表上下文,我们会得到不同的结果:
my ($v) = qw(a b c); # $v is now 'a'
ETA:关于原型:
在f1
中,您看到的是数组被强制进入标量上下文,因为子例程需要一个标量参数。这就是为什么f1
使用数组打印3
(大小)。当原型查找一个数组时,该数组保留在默认列表上下文中,并且按照正常方式完成分配(如上所述)。
作为一个额外的说明:原型有一个非常具体的用途,使子程序在参数处理方面表现得更像某些内置函数。比如sort { code here }
或push @array, $foo
。
如果这不是您所追求的,您应该一起跳过原型并简单地编写:
sub f1 {
...
}
文档在这里