Hm, so it does. The only non-contrived example I can think of is:
BEGIN {
print exists(&frobnicate)?1:0, "\n";
my %OPS = (
frob => \&frobnicate,
knob => \&knobnicate,
);
sub runops { print $_->(), "\n" for values %OPS }
}
sub frobnicate { 'frobnicate' }
sub knobnicate { 'knobnicate' }
I have done it in the past in order to keep the dispatch table visible only to the function using it, but I find the extra indentation rather ugly so I tend to avoid it. I don't know if I'd call it strange and rare, but it certainly isn't unexpected. The need for it is also removed in 5.10, but I mention this only so that someone else won't.
Edit: I realize now this has gotten somewhat far afield of the original question. You asked me to substantiate that if you remove auto-vivification by reference then all subroutines would have to be defined before they can be referred to. It's true, they would need only be declared, not defined, before taking a reference. |