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 for foo()
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 bar
thus:
sub bar($;@) {
foo(shift, @_);
}
You're misunderstanding Perl prototypes. Remove them and it'll work fine.
See: Why are Perl 5's function prototypes bad?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With