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

I'm having a really hard time figuring this one out. Every time I compile it says: Can't call method "name" on an undefined value at ./test.pl line 9.
### test.pl ### use Employee my $person = Employee->new(); $person->name("bob"); $name = $person->name; print "hello, "; print $name; ### Employee.pm ### package Employee; use strict; sub new { my $invocant = shift; my $class = ref($invocant) || $invocant; my $self = { }; bless($self, $class); $self->{name} = "unknown"; return $self; } sub name { my $self = shift; if (@_) { $self->{name} = shift; } return $self->{name}; } 1;

Replies are listed 'Best First'.
Re: Can't call method on an undefined value?
by dragonchild (Archbishop) on Apr 11, 2005 at 14:45 UTC
    Try adding strict to test.pl and warnings to both. Your bug will be readily apparent. :-)
      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. :-)

Re: Can't call method on an undefined value?
by borisz (Canon) on Apr 11, 2005 at 14:49 UTC
    Your code should work fine, if you add a ; after use Employee and a my before $name = $person->name;.
    Boris