in reply to How do you determine if a user-defined function exists?

You can check if it's in a specific package, but

In the current package:

UNIVERSAL::can(__PACKAGE__, 'myfunc')

In a specific package:

UNIVERSAL::can($pkg, 'myfunc')

In any package:

sub check_for_func { my ($func_name) = @_; my @pkgs_with_func; my $helper; # Don't combine this line with the assignement. $helper = sub { my ($pkg_name) = @_; my $pkg = do { no strict 'refs'; \%{$pkg_name.'::'} }; push(@pkgs_with_func, $pkg_name) if $pkg->{$func_name} && *{$pkg->{$func_name}}{CODE}; my $pkg_name_ = ($pkg_name eq 'main' ? '' : $pkg_name.'::' ); /^(.*)::$/ && $1 ne 'main' && &$helper($pkg_name_.$1) foreach (keys(%$pkg)); }; &$helper('main'); return @pkgs_with_func; } print(join(', ', check_for_func('test')), $/);

Replies are listed 'Best First'.
Re^2: How do you determine if a user-defined function exists?
by revdiablo (Prior) on Nov 30, 2004 at 01:14 UTC

    ikegami++, good reply. The only thing I'd do differently is use the class method syntax for calling UNIVERSAL::can. I think it looks nicer:

    __PACKAGE__->can('myfunc'); $pkg->can('myfunc');

      Not only does it look nicer (especially with CLASS), but it allows packages and modules to overload can() too.