in reply to function call / return philosophies

What I've seen most often is a function that takes a list of, for instance, county_id's, and returns a list of names in the same order. Then if you pass in one or 20, or even none at all, it does essentially the same thing, and you don't need special processing on either end to deal with different calling conventions. If you really want the hash, you can make it on the calling side.
my %names; @names{@county_ids}=county_name_by_id($dbh, @county_ids);