为什么Perl压缩我的数组?

问题描述:

这里有一个短的测试程序:为什么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 

这是因为当调用foo(@_),原型为foo()迫使第一参数(这是一个数组),以被转换成一个标量(这是在@_元素的数量)。

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

FWIW,你可以保持原型的地方,如果你改变bar这样的:

sub bar($;@) { 
    foo(shift, @_); 
} 

摆脱($;@)后你的函数名称,它工作正常。

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

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