Perl 如何处理Moose中的可选参数?

Perl 如何处理Moose中的可选参数?,perl,parameters,moose,Perl,Parameters,Moose,我现在开始使用PerlOOP,使用“Moose”包 编译器抱怨它“无法修改Parser.pm第16行的非左值子例程调用。” 我不太明白为什么我不能分配一个新对象。我想有一种更好或更有效的方法可以对驼鹿进行可选参数设置 #!/usr/bin/perl -w package Parser; use Moose; require URLSpan; require WWW::Mechanize; has 'urlspan' => (is => 'rw', isa =>

我现在开始使用PerlOOP,使用“Moose”包

编译器抱怨它“无法修改Parser.pm第16行的非左值子例程调用。”

我不太明白为什么我不能分配一个新对象。我想有一种更好或更有效的方法可以对驼鹿进行可选参数设置

    #!/usr/bin/perl -w

package Parser;

use Moose;

require URLSpan;

require WWW::Mechanize;

has 'urlspan' => (is => 'rw', isa => 'URLSpan', required => 1);
has 'mech' => (is => 'rw', isa => 'WWW::Mechanize');

sub BUILD {
    my $self = shift;
    if(!$self->mech) {
        warn("no Mech set for " . $self->urlspan->name);
        $self->mech = WWW::Mechanize->new(agent => 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.4',
                                         stack_depth => 1
                                         ); #line 16
        }

}

$self->mech
是一个方法调用;你不能把它当作C结构中的一个字段。如果要设置它,需要将新对象传递给它

        $self->mech( 
            WWW::Mechanize->new(
                agent => 'xyz',
                stack_depth => 1
            )
        );

虽然Perl提供了多年来一直尝试的使用属性的能力(通过所谓的左值子函数),但它并不是第一个OO Perl版本中的功能,人们几乎学会了不用它。尤其是因为实现验证有点棘手(而且效率很低)

您可以使用,但是(根据文档),代价是没有对某些属性进行类型检查


我建议只使用$self->attribute(“value”)样式。

驼鹿最喜欢的方法可能是在属性上设置lazy\u build:

has 'mech' => (is => 'rw', isa => 'WWW::Mechanize', lazy_build => 1);
sub _build_mech {
     warn("no Mech set for " . $self->urlspan->name);
     WWW::Mechanize->new(
           agent => 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.6)'.
                    ' Gecko/2009011913 Firefox/3.0.4',
           stack_depth => 1
     );
}

这将允许在第一次调用属性“mech”时填充它,除非构造函数或访问器另行设置(因为它仍然是“rw”)。

我看不到与可选参数的任何连接。你能详细说明一下吗?不要使用那个模块,它是被设计破坏的。@Dave Rolsky:以我注意到的方式,或者以其他方式?谢谢回到这个问题和你的解释!