Я знаю, что вы уже приняли ответ, но у вас есть серьезные проблемы с вашим кодом.
- Поместите определения вашего объекта в файлы, заканчивающиеся на
.pm
, а не .pl
use
модулей вместо do
ing библиотек. - Косвенная запись объектов может привести к ошибкам, лучше избегать ее использования.
Я взялсвобода переписывания вашего кода с небольшими изменениями, необходимыми для устранения проблем.
Сначала в MyTest.pm
:
package MyTest; # Changed name to avoid name conflicts.
use strict; # Always
use warnings;
sub new {
my $class = shift;
# Removed parens on $class, they put the assignment of shift's
# result into list context (which had no effect on the result,
# but it is also unnecessary).
my %defaults = ( attr => 'asdfa' );
my %args = %defaults, @_;
# Assigns arguments and default values to %args, actual named
# args will override keys in defaults where they match;
my $self = {};
bless $self, $class;
while( my ($attr, $value) = each %args ) {
$self->$attr($value); # Initialize each attribute in named arg hash.
}
return $self;
}
sub attr {
my $self = shift;
if( @_ ) {
$self->{_attr} = shift;
}
return $self->{attr}
}
sub log {
my $self = shift; # Get invocant
print "Accessed via class: ", $self->attr, "\n";
}
process.pl
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use MyTest;
my $test = MyTest->new(); # Direct call of object constructor
$test->log;
print "Accessed via main: $test->{_attr}\n"; # Violating encapsulation
# is generally a bad idea.
ЕслиВы делаете тяжелый ООП, подумайте, как научиться использовать Moose .Moose - мощная, ультрасовременная объектная система для Perl, которая добавляет мощные возможности и сокращает стандартный код.
Если вы хотите изучить "классический" Perl OOP, учебники в perldoc ( perlboot , perltoot , perlobj , perlbot и perltooc ) довольно хороши.Если вы хотите углубиться в это, Объектно-ориентированный Perl Дамиана Конвея - фантастическая книга.