Lowry76 has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks,
I have a problem with code references. I have a hash with code references as values. Unfortunately, as soon as the script is called those functions are executed instead of just referenced. Here's an example

my $subs = {a=>\&_a}; sub _a{ my $attr = shift; my $obj = SOME::PACKAGE->new($attr); }


The variable $attr is used in SOME::PACKAGE to do a database request. As soon as the script is initialized now it throws an error that $attr in SOME::PACKAGE is undef. This is obvious because I didn't call the function yet (well, apparently I did but didn't want to). Any suggestions how to reference a function like that without calling it when the script is initialized?
Cheers,
Lowry


## Problem solved ###
The lesson for today: know your perl! Problem was in fact that one of the subs of class SOME::PACKAGE was called when initialized. Which of the subs you're asking? The sub "import"! And yes, I wrote SOME::PACKAGE, and no, I didn't know import()
Renaming import() to _import() fixed it.

Replies are listed 'Best First'.
Re: Code reference ( \&notThisCall() )
by Anonymous Monk on Aug 26, 2014 at 07:20 UTC

    Unfortunately, as soon as the script is called those functions are executed instead of just referenced. Here's an example

    The code you posted does not do that, so its not an example

    Any suggestions how to reference a function without calling it when the script is initialized?

    In your real code check all instances of \& for a pair of ()

    my $areference = \&function; ## wanna

    my $called = \&function(); ## NOT wanna

      Thanks for the answer. Unfortunately already checked that. No brakets there.

        Then post a small self-contained code example that actually demonstrates the problem, so we can see what it is that you're doing wrong.


        Dave

        Thanks for the answer. Unfortunately already checked that. No brakets there.

        Then check other parts of your code for place where you call/invoke the subroutines ... through $subs or other means :)

        Also check for other inadvertent (but, believe me, all too possible) fatfinger variations that you NOT wanna have:

        c:\@Work\Perl>perl -wMstrict -MData::Dump -le "sub S { print 'oops...'; } ;; my $hr = { 'darn' => S, 'rats' => \S, 'nuts' => &S, }; ;; dd $hr; " oops... oops... oops... { darn => 1, nuts => 1, rats => \1 }

Re: Code reference
by NetWallah (Canon) on Aug 26, 2014 at 17:34 UTC
    Other possible "oops" calls ..
    _a; ::_a; main::_a; # Possibly from another package..
    Are you using "strict" and "warnings" ?

            "You're only given one little spark of madness. You mustn't lose it."         - Robin Williams