为什么Perl压缩我的阵列?

时间:2008-12-02 19:30:33

标签: 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";

为什么输出为:

sql: 3
params: 

而不是这个?

sql: select * from blah where x = ? and y = ?
params: 2,3

3 个答案:

答案 0 :(得分:20)

这是因为当你调用foo(@_)时,foo()的原型会强制将第一个参数(也就是一个数组)转换为标量(这是{{1}中的元素数量})。

查看我之前提问“Why are Perl Function Prototypes Bad”的问题的答案?

FWIW,如果您更改@_,可以保留原型:

bar

答案 1 :(得分:10)

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

请参阅:Why are Perl 5's function prototypes bad?

答案 2 :(得分:5)

在你的函数名之后删除($;@),它可以正常工作。