in reply to How to tell methods exist in a package

http://perldoc.perl.org/functions/exists.html

use strict; use warnings; if (exists &FOO::bar) { print "bar exists in foo\n"; } package FOO; sub bar { }
Update: tirwhan has raised an important distinction. This method will only tell you if the package contains a sub with that name. If the package inherits a sub with that name, it won't return true. So the choice depends on whether your logic requires 'package has subroutine named x' or 'package can do x'.

--------------------------------------------------------------

"If there is such a phenomenon as absolute evil, it consists in treating another human being as a thing."

John Brunner, "The Shockwave Rider".

Replies are listed 'Best First'.
Re^2: How to tell methods exist in a package
by tirwhan (Abbot) on Nov 20, 2005 at 12:07 UTC

    This will however not show up inherited methods. Which can be the desired behaviour in certain cases of course.

    use strict; use warnings; if (exists &FOOBAZ::bar) { print "bar exists in foo\n"; } if (FOOBAZ->can("bar")) { print "FOOBAZ can do bar\n"; } package FOO; sub bar { } package FOOBAZ; use base("FOO");

    Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. -- Brian W. Kernighan
      What if the package is; $val = "FOO" ;
      This doesn't work: if (exists &$val::mySub) {...}

      Thanks
      Luca

        No, but this does:

        $val="FOO"; $method="${val}::mySub"; if (exists &$method) {...}

        Also,

        if ($val->can("mySub")) { ... }

        works (with the aforementiond behavioural differences of course).


        Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. -- Brian W. Kernighan