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

Try adding strict to test.pl and warnings to both. Your bug will be readily apparent. :-)
  • Comment on Re: Can't call method on an undefined value?

Replies are listed 'Best First'.
Re^2: Can't call method on an undefined value?
by ysth (Canon) on Apr 11, 2005 at 16:09 UTC
    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.

      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...