Presumebly you have turned on warnings which is a great start! Otherwise you would not have noticed this issue at all.
One thing that helps me out tremendously (other then -w) when trying to test how things work is to use the debugger. Not sure exactly where I picked this up, but to use the debugger interactively without firing up a script do the following:
perl -d -e 0
This will give you a prompt that you can use to execute a line of perl. This is priceless when trying to figure out how perl is really working.
In this case, pasting
$query1 = "SELECT $_[2],$_[3],$_[$_-1] FROM ".$_[1] into the prompt produces tons of uninitialized variable warnings for $_. The next thing I would do would be to test (some what visually) if in fact $_ was actually defined (from the warning there is no way that it could be, but "trust, but verify"). To do this simply
print defined $_. If $_ were initialized the print statement would print a 1, but since it is not it prints nothing (a blank line is printed).
There are some caveats about scoping (my variables) and you will want to check out the "x $hash_ref" command if you use a lot of hash references.