Here’s a short test program:
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';
Why is the output this:
sql: 3 params:
Rather than this?
sql: select * from blah where x = ? and y = ? params: 2,3
It’s because when you call
foo(@_), the prototype forfoo()forces the first parameter (which is an array) to be converted into a scalar (which is the number of elements in@_).See answers to my previous question asking ‘Why are Perl Function Prototypes Bad‘?
FWIW, you can keep the prototypes in place if you change
barthus: