这是一个简短的测试程序:
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";
Run Code Online (Sandbox Code Playgroud)
为什么输出如下:
sql: 3
params:
Run Code Online (Sandbox Code Playgroud)
而不是这个?
sql: select * from blah where x = ? and y = ?
params: 2,3
Run Code Online (Sandbox Code Playgroud)
Aln*_*tak 20
这是因为当你调用时foo(@_),用于foo()强制第一个参数(即一个数组)的原型被转换为标量(这是元素的数量@_).
查看我之前提出的问题的答案" 为什么Perl函数原型不好 "?
FWIW,如果您改变原因,可以保留原型bar:
sub bar($;@) {
foo(shift, @_);
}
Run Code Online (Sandbox Code Playgroud)