遵循本教程
https://www.codeproject.com/Articles/3152/Perl-Object-Oriented-Programming
我没有看到模块Address.pm在哪里..我错过了什么或文章有错误,或者当其中一个模块说“使用地址”时我有误解;
mac1:moduleTEST1 user1$ ./Employee.pl
Can't locate object method "new" via package "Address" (perhaps you forgot to load "Address"?) at ./Employee.pl line 16.
mac1:moduleTEST1 user1$
答案 0 :(得分:3)
该教程已过时且无用。具体来说,它比Perl附带的文档要糟糕得多。使用perldoc perltoc
获取目录,并至少阅读一次。
请参阅perldoc perlootut
和perldoc perlobj
。
package Address;
use strict;
use warnings;
sub new {
my $class = shift;
my $args = shift;
my %self = map +($_ => $args->{$_}), qw( street city state zip );
bless \%self => $class;
}
sub street {
my $self = shift;
if ( @_ ) {
$self->{street} = $_[0];
return;
}
return $self->{street};
}
# ditto for the rest of the accessors # there are
# ways to cut down the boilerplate once you learn
# the basics
#
# ...
__PACKAGE__
__END__
您可以像这样使用此模块:
my $address = Address->new({
street => '123 E. Any St',
city => 'Any Town',
state => 'AY',
zip => '98765',
});
当然,这个小小的演示中缺少很多东西。例如,写入的访问器允许您更改对象的状态。不可变对象更容易推理,因此您可能希望通过将其更改为:
来禁止它 sub street { $_[0]->{street} }
它还允许您将所需的任何值分配给state
和zip
等字段。因此,您可能希望在构造函数中验证这些值,确保仅传递类字段的值,定义传递的所有值等。
在该过程结束时,您可能会认为继续编写样板并使用Moo或Moose来利用更丰富的功能组合是没有意义的。
即使这样,它也有助于了解幕后发生的事情。