Можно ли передавать ссылки на объекты Perl между модулями?
Абсолютно! * * 1005
В этом тестовом скрипте я создаю два класса, один для тестирования и один для тестирования. Помните, что объекты - это просто ссылки, а методы - просто подпрограммы; используйте их таким же образом.
#!/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
систему