为什么Perl会挤压我的阵列?

mik*_*ike 6 perl

这是一个简短的测试程序:

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)


And*_*ico 10

你误解了Perl原型.删除它们,它会工作正常.

请参阅:为什么Perl 5的功能原型很糟糕?


Tar*_*ski 5

摆脱($;@)你的功能名称,它工作正常.