【发布时间】:2015-12-04 14:37:10
【问题描述】:
下面的 Perl 代码将打印一个“1”,但是函数 test2 确实没有合法的输入值。为什么 Perl 会这样?
test();
sub test {
my ($var) = @_;
test2($var);
}
sub test2 {
my (@array) = @_;
print scalar @array;
}
【问题讨论】:
下面的 Perl 代码将打印一个“1”,但是函数 test2 确实没有合法的输入值。为什么 Perl 会这样?
test();
sub test {
my ($var) = @_;
test2($var);
}
sub test2 {
my (@array) = @_;
print scalar @array;
}
【问题讨论】:
在test 内部,$var 被赋值设置为undef。因此,您对 test2 的调用会传递一个包含一个元素 undef 的列表。
【讨论】:
test2($var) 将一个标量传递给test2 ($var),因此my (@array) = @_; 将一个标量分配给@array。
有问题的标量 ($var) 的值是 undef,因为您在 my ($var) = @_; 中为 $var 分配了“无”。
也许您想要test2(@_)(通过@_ 中的零标量)而不是test2($var)(通过$var 中的一个标量)?
【讨论】:
test2( defined($var) ? $var : () ) aka test2( $var // () ) 也可能感兴趣。
BEGIN { *test = \&test2 } 这使得函数 test 的定义与 test2 为函数创建别名相同。这确实是我一直在寻找的功能。