Just in case anybody missed it amongst the responses, let me emphasize:
- Do not use the &foo; style of call without a really good reason.
- (Converse: if you use &, also use () unless you have a really good reason.)
- Don't use it when foo() doesn't use what it's passed. Explicitly say &foo().
- Don't use it when you actually want to pass @_ along to foo. Say &foo(@_) if that's what you mean.
Even if you know all about the feature, it's just too easy to forget that something is being passed. And if a bug results, it can be hard to see the cause.
When should you use it? As an optimization. That is, after determining that the code isn't fast enough and determining that the code calling the function represents a significant part of the time used. But highlight what you are doing (and why) with a comment.