I have no words to express how f*cked *p typeglobs are!!!
If only a sub is using the symbol, then the coderef is stored directly where the glob is supposed to be.
(Larry gets a spanking next time we meet ;)
Anyway this code seems to work in all edge cases, only tested on mobile phone yet.
use strict; use warnings; use feature 'say'; no autovivification; use Data::Dump qw/pp/; sub sub_exists{ my $name = shift; return exists $::{$name} # symbol exists && ( ref $::{$name} eq "CODE" # only code || (*{$::{$name}}{CODE} && 1) # also code || !1 # false ); } for my $name (qw/zero one two three/) { pp { $name => sub_exists($name) }; } our $one=1; our $two=2; sub two {2}; sub three {3}
{ zero => "" } { one => "" } { two => 1 } { three => 1 }
Cheers Rolf
(addicted to the Perl Programming Language :)
see Wikisyntax for the Monastery
Extend code to cover subs in other namespaces than main
In reply to Re^2: exists(&subname) causes strange autovivification problem (workaround)
by LanX
in thread exists(&subname) causes strange autovivification problem
by jimav
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |