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 }