in reply to Re: Can't call method on an undefined value?
in thread Can't call method on an undefined value?

It's a cute little bug, isn't it?

I don't actually think it will be necessarily apparent though. With test.pl:

use strict; use warnings; use Employee my $person = Employee->new(); $person->name("bob"); $name = $person->name; print "hello, "; print $name;
I get:
Global symbol "$person" requires explicit package name at test.pl line + 5. Global symbol "$name" requires explicit package name at test.pl line 6 +. Global symbol "$person" requires explicit package name at test.pl line + 6. Global symbol "$name" requires explicit package name at test.pl line 8 +.
It's obvious that $name needs a declaration to make strict happy, but you could still sit and stare at the $person warnings and not realize why it's complaining.

The problem is the missing semi-colon after use Employee. The "my $person" line is taken as an import to request from Employee, and is executed at compile time in a scope all its own, so the rest of the program doesn't use a lexical $person, and the global $person isn't ever set.

Replies are listed 'Best First'.
Re^3: Can't call method on an undefined value?
by dragonchild (Archbishop) on Apr 11, 2005 at 17:22 UTC
    However, the important points to note:
    1. strict makes the declaration for $name required, removing that as a possible problem.
    2. Global symbol "$person" requires explicit package name at test.pl line 5. makes it apparent that there's a problem with the declaration of $person.
    3. Once you know there's a problem with the declaration of $person, you look at that line and the line above. You quickly find the missing semi-colon.

    Hence, the readily-apparent comment. :-)

      What's not there can be the hardest to see...
        ... but it's a lot easier when you know where in the haystack the needle has to be.