这是一个简短的测试程序:
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
答案 0 :(得分:20)
这是因为当你调用foo(@_)
时,foo()
的原型会强制将第一个参数(也就是一个数组)转换为标量(这是{{1}中的元素数量})。
查看我之前提问“Why are Perl Function Prototypes Bad”的问题的答案?
FWIW,如果您更改@_
,可以保留原型:
bar
答案 1 :(得分:10)
你误解了Perl原型。删除它们,它会正常工作。
答案 2 :(得分:5)
在你的函数名之后删除($;@)
,它可以正常工作。