use strict;
sub dynamic { print "hello\n"; }
my $name = "dynamic";
&$name();
.. and yet this is ok? (they differ only in the last line)
use strict;
sub dynamic { print "hello\n"; }
my $name = "dynamic";
&{ \&$name }();
Before seeing this, I would have bet anything that the &{\&{ ... }} operation was absolutely the same as &{...} (barring weird action-at-a-distance caused by tying, overloading, etc). In fact, I'm not sure whether to consider this a bug or not. Indeed, what is \&$name doing other than "using string as a subroutine ref", which is outlawed under strict refs?
Yet a similar idea with other kinds of refs doesn't do this. Both of these examples fail under strict refs (in my mind because @{\@{...}} is unconditionally the same thing as @{...} ):
use strict;
our @dynamic = ("hello\n");
my $name = "dynamic";
print @$name;
use strict;
our @dynamic = ("hello\n");
my $name = "dynamic";
print @{ \@$name };
My conclusion is that there is an important distinction between naming a subroutine and invoking it, which is manifested bizarrely by different behaviors in the \&{blah} and &{blah} mechanisms.
|