为什么我不能运行这个perl代码?

时间:2017-08-23 21:26:13

标签: perl

遵循本教程

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$

1 个答案:

答案 0 :(得分:3)

该教程已过时且无用。具体来说,它比Perl附带的文档要糟糕得多。使用perldoc perltoc获取目录,并至少阅读一次。

请参阅perldoc perlootutperldoc 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} }

它还允许您将所需的任何值分配给statezip等字段。因此,您可能希望在构造函数中验证这些值,确保仅传递类字段的值,定义传递的所有值等。

在该过程结束时,您可能会认为继续编写样板并使用MooMoose来利用更丰富的功能组合是没有意义的。

即使这样,它也有助于了解幕后发生的事情。