in reply to shift operator

the '@_' list is your list of input parameters. If someone had said:
SearchPubMed("A","B","C","D");
Then in SearchPubMed,
$InputRow = "A"; $QueryID = "B"; # etc...
It seems a bit squirrely to have to access your input parameters this way, perhaps. Using 'shift' not only accesses the parameter, but it also removes it (meaning that you cannot later say '$firstParam = $_[0]' to get at the original first parameter, a debatable benefit of not using shift). It may be simpler to rewrite several 'shift' lines as a single line:
my($inputRow,$QueryId,...) = @_;
That's typically the way most code is written these days, but there's still some rare cases where repeated use of 'shift' makes for more efficient code.