Perl对象在同一个模块中

时间:2016-05-06 03:22:57

标签: perl oop object

标题含糊不清,但我会解释它。

我有一个Perl脚本,它使用名为systemId

的模块

我在脚本

中创建了一个对象
my $id = systemId->new({_dom => "dev"});

我打算实例化一个类似于上面的对象但在systemId.pm内的对象。

我该怎么做?

我无法在网上搜索,因为我不知道要搜索什么。

2 个答案:

答案 0 :(得分:4)

您可以像在脚本中一样执行此操作。与将包和main::放在同一文件中的方式类似,一旦定义了包,就可以在包文件中使用该类。请在代码后查看评论。

File Play.pm
package Play;    
use warnings;
use strict;

sub new {
    my $class = shift;
    my $self = { _data => shift || 'default' }; 
    bless $self, $class;
    print "New object created.\n";
    return $self;
}

sub data {
    my $self = shift;
    if (@_) { $self->{_data} = shift }
    return $self->{_data};
}

print "Inside the package. Create object.\n";
my $obj = Play->new();
my $data = $obj->data();
print "data: $data\n";
print "\n";

1;

脚本

use warnings;
use strict;
use Play;

print "In main\n";
my $obj = Play->new(25);
print "data: " . $obj->data() . "\n";

运行脚本时的打印输出

Inside the package. Create object.
New object created.
data: default

In main
New object created.
data: 25

bless执行的调用$self是类Play的对象。来自bless

  

祝福REF,CLASSNAME
      祝福REF
      这个函数告诉REF引用的东西它现在是CLASSNAME包中的一个对象。如果省略CLASSNAME,则使用当前包。 [...]

由于我们在包中是正确的,因此它可以用作对象和调用它的方法。来自perlobj

  

一旦我们祝福了$ self引用的哈希,我们就可以开始调用它了。

这指的是使用$self hashref。

请注意,在创建对象时,它们可能是初始化问题,以及正在做什么以及可能重要的问题。

我无法帮助,但问,你想用这个做什么?

答案 1 :(得分:3)

一样简单:

my $id = systemId->new({_dom => "dev"});

您也可以使用......

my $id = __PACKAGE__->new({_dom => "dev"});

......但第一个更明显。

可以在任何地方创建一个新的对象实例,包括包/类本身。

->new函数通常是:

sub new {
    my $class = shift;
    my $self = bless {@_}, $class;
    return $self;
}

实例实际上是在类模块本身中创建的(使用bless)。 Perl中的->new没有魔法,有些模块也使用其他名称,请参阅内部->now的{​​{3}} ->new(epoch => time)