1

我正在编写一个使用 Perl 模块 Module.pm 的 Perl 脚本。

Module.pm 是这样的:

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;

我这样称呼它:

use Module

my $result = Module::getInfo();

但是我在第 # 行不断收到一个 FATAL ERROR (at Module.pm) undefined object。这是为什么?

此外,如果我删除 getInfo() 子例程中的第一个注释并将另一个参数添加到我的调用行,那么我不会收到相同的错误。为什么?我以为我不必将 Module 对象作为参数发送来调用子例程?

这是一个使用 Perl 5.8.8 的 Linux 服务器。

4

1 回答 1

4

当您调用包的成员函数时,包名称仅在您使用该->符号时作为隐式第一个参数传递。这称为“方法调用”;它还可以搜索类层次结构以确定调用什么。如果前缀是类名,则隐含的第一个参数是包的名称,作为字符串。如果前缀是对象引用,则隐含的第一个参数是该对象引用。

使用该::符号,它是一个没有隐式第一个参数的普通子例程调用。

例如:

% cat foo.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.10;

package M {
    sub getInfo {
        my($self) = shift;
        say "\$self = ", ($self // 'undef');
    }

    1;
};

M::getInfo();
M->getInfo();
% ./foo.pl
$self = undef
$self = M
% 

更改Module::getInfo()Module->getInfo()

Perl 文档中对此进行了更详细的讨论:

旧版本的 Perl 有perltootperlboot教程;perlootut从 5.20(或可能更早)开始,它们已被取代。

于 2014-07-25T19:50:20.503 回答