可以在模块之间传递Perl对象引用吗?

时间:2011-12-21 15:14:32

标签: perl class module reference perl-module

示例代码:

testClass1.pm

package testClass1; 
{
my $testClass2Ref;

sub new
{
    my($class) = shift;
    $testClass2Ref= shift;
    bless $self, $class;
    return $self;}
}

sub testRef
{
    $testClass2Ref->testRef;
}
}

testClass2.pm

package testClass2; 
{

sub new
{
    my($class) = shift;
    bless $self, $class;
    return $self;}
}

sub testRef
{
    print "Test 2";
}
}

test.pl

use testClass1;
use testClass2;

my $testClass2 = testClass2->new();
my $testClass1 = testClass2->new($testClass2);
$testClass1->testRef;

当我尝试拨打$testClass1->testRef时,$testClass2Ref=undef

如何从父级传递对象的引用?

更新

哦,对不起,我在示例的构造函数中错过了字符串。

sub new
{
    my($class) = shift;
    $testClass2Ref = shift;
    my $self    = {name=>'testClass1'};
    bless $self, $class;
    return $self;
}

此测试正常,但Eclipse调试器将此变量显示为“undef”。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

除了语法错误,您还没有使用strict模式。打开它会显示$self未在任何一个包中声明。通过替换:

bless $self, $class;

使用:

my $self = bless {}, $class;

一切都按预期进行。

答案 1 :(得分:1)

修复语法错误时,它可以正常工作。

> ./test.pl
> Test 2

你错过了

my $self = {};
两个new方法中的

一个有用的工具是

perl -wc testClass1.pm

答案 2 :(得分:1)

  

可以在模块之间传递Perl对象引用吗?

绝对!

在这个测试脚本中,我创建了两个类,一个用于测试,另一个用于测试。记住对象只是引用,方法只是子例程;以同样的方式使用它们。

#!/usr/bin/env perl

use strict;
use warnings;

package Tester;

sub new {
  my $class = shift;
  my ($other) = @_;

  my $self = { other => $other };
  bless $self, $class;

  return $self;
}

sub examine { 
  my $self = shift; 
  print "I'm holding a: ", ref( $self->{other} ), "\n";
}

package Candidate;

sub new { return bless {}, shift }

package main;

my $candidate = Candidate->new();
my $tester = Tester->new( $candidate );

$tester->examine();

编辑:现在使用更为现代化的系统MooseX::Declare(基于Moose)与Method::Signatures。这样可以节省大量的样板,让您专注于您希望对象执行的操作,而不是如何实现它们。

#!/usr/bin/env perl

#technically Moose adds strict and warnings, but ...
use strict;
use warnings; 

use MooseX::Declare;
use Method::Signatures::Modifiers;

class Tester {
  has 'other' => ( isa => 'Object', is => 'rw', required => 1 );

  method examine () {
    print "I'm holding a: ", ref( $self->other() ), "\n";
  }
}

class Candidate { }

no MooseX::Declare;

package main;

my $candidate = Candidate->new();
my $tester = Tester->new( other => $candidate );

$tester->examine();

对于更实际的情况,请参阅一些较大的模块系统如何传递表示复杂概念的对象。在我的头顶,HTTP::Response对象遍布LWP系统