in reply to passing array references

People here tend to frown on this sort of thing, but you can use globs:
sub f { return \'hello', [1..3], { a => b }, \&f } local (*a, *b, *c, *g) = foo(); # $a, @b, %c, and &g are now defined.