I am writing a Perl script which makes use of a Perl module, Module.pm.
Module.pm is like so:
package Module;
use strict;
use warnings;
sub getInfo {
my $self = shift;
#my $var = shift;
if (!$self)
{
my $errmsg = "My ERROR MESSAGE";
return [1, $errmsg];
}
return [1, $self];
}1;
And I am calling it like so:
use Module
my $result = Module::getInfo();
But I keep getting a FATAL ERROR (at Module.pm) undefined object at line #. Why is that?
Furthermore if I remove the first comment in the getInfo() subroutine and add another argument to my calling line then I don't get the same error. Why? I thought I didn't have to send the Module object as an argument to call the subroutine?
This is a Linux server using Perl 5.8.8.
When you call a member function of a package, the package name is passed as an implicit first argument only if you use the
->
notation. This is known as a "method call"; it can also search the class hierarchy to determine what to call. If the prefix is a class name, the implicit first argument is the name of the package, as a string. If the prefix is an object reference, the implicit first argument is that object reference.With the
::
notation, it's an ordinary subroutine call with no implicit first argument.For example:
Change
Module::getInfo()
toModule->getInfo()
.This is discussed in more detail in the Perl documentation:
perldoc perlsub
(subroutines)perldoc perlobj
(object reference)perldoc perlootut
(Object-Oriented Programming in Perl Tutorial)Older versions of Perl had
perltoot
andperlboot
tutorials; they've been superseded byperlootut
as of 5.20 (or possibly earlier).