Search code examples
perlintrospection

How can I determine if a Perl function exists at runtime?


I'm working on a test framework in Perl. As part of the tests, I may need to add precondition or postcondition checks for any given test, but not necessarily for all of them. What I've got so far is something like:

eval "&verify_precondition_TEST$n";
print $@ if $@;

Unfortunately, this outputs "Undefined subroutine &verify_precondition_TEST1 called at ..." if the function does not exist.

How can I determine ahead of time whether the function exists, before trying to call it?


Solution

  • With defined:

    if (eval "defined(&verify_precondition_TEST$n)") {
        eval "&verify_precondition_TEST$n";
        print $@ if $@;
    }
    else {
        print "verify_precondition_TEST$n does not exist\n";
    }
    

    EDIT: hmm, I only thought of eval as it was in the question but with symbolic references brought up with Leon Timmermans, couldn't you do

    if (defined(&{"verify_precondition_TEST$n"}) {
        &{"verify_precondition_TEST$n"};
        print $@ if $@;
    }
    else {
        print "verify_precondition_TEST$n does not exist\n";
    }
    

    even with strict?