这是一个简短的测试程序:
sub foo($;@) { my $sql = shift; my @params = @_; print "sql: $sql\n"; print "params: " . join(",", @params); } sub bar($;@) { foo(@_); } bar("select * from blah where x = ? and y = ?",2,3); print "\n";
为什么输出如下:
sql: 3 params:
而不是这个?
sql: select * from blah where x = ? and y = ? params: 2,3
Alnitak.. 20
这是因为当你调用时foo(@_)
,用于foo()
强制第一个参数(即一个数组)的原型被转换为标量(这是元素的数量@_
).
查看我之前提出的问题的答案" 为什么Perl函数原型不好 "?
FWIW,如果您改变原因,可以保留原型bar
:
sub bar($;@) { foo(shift, @_); }
Andrew Medic.. 10
你误解了Perl原型.删除它们,它会工作正常.
请参阅:为什么Perl 5的功能原型很糟糕?
这是因为当你调用时foo(@_)
,用于foo()
强制第一个参数(即一个数组)的原型被转换为标量(这是元素的数量@_
).
查看我之前提出的问题的答案" 为什么Perl函数原型不好 "?
FWIW,如果您改变原因,可以保留原型bar
:
sub bar($;@) { foo(shift, @_); }
你误解了Perl原型.删除它们,它会工作正常.
请参阅:为什么Perl 5的功能原型很糟糕?
摆脱($;@)
你的功能名称,它工作正常.