调用对属性的引用时出现Perl Moose异常';作者方法

调用对属性的引用时出现Perl Moose异常';作者方法,perl,reference,moose,writer,Perl,Reference,Moose,Writer,我试图将对属性的writer方法的引用传递给另一个类方法。setter方法显然是在执行print语句后调用的。但是,会出现以下错误: Attribute (dir) is required, so cannot be set to undef at Test.pm line 51 Test::_validateDir('Test=HASH(0x2270be0)', 'CODE(0x22a90f8)') called at test.pm line 37 Test::BUILD('test_moo

我试图将对属性的writer方法的引用传递给另一个类方法。setter方法显然是在执行print语句后调用的。但是,会出现以下错误:

Attribute (dir) is required, so cannot be set to undef at Test.pm line 51
Test::_validateDir('Test=HASH(0x2270be0)', 'CODE(0x22a90f8)') called at test.pm line 37
Test::BUILD('test_moose=HASH(0x2270be0)', 'HASH(0x1879728)') called at generated method (unknown origin) line 50
Test:new('Test', dir=>'my_bin') called at ./test_moose.pl line 26
在Moose中引用生成的writer方法有什么原因吗?或者有没有其他更好的方法

代码如下:

package Test;
use Moose;
use File::Spec;

has 'dir' => (is => 'ro', isa => 'Str', required => 1, writer '_set_dir',);

sub BUILD {
    my ($self, $hr) = @_;
    $self->_validateDir(\&_set_dir);
}

sub _validate_dir {
    my ($self, $setter) = @_;
    my $dir = File::Spec->rel2abs($self->dir, '/home/me');
    if (! -e $dir) {
       print "creating directory\n";
       #create directory
    }
    &$setter($dir);
}

将setter称为常规sub是正确的吗?您不应该将
$self
作为第一个参数传递吗?

在Perl中,对方法的引用不包括关联的对象。调用引用时,必须提供对象(或类,如果是类方法)作为第一个参数

&$setter($self, $dir);
或者,(当
$setter
是代码引用但更惯用时,等效):


您得到“Attribute(dir)是必需的,因此不能设置为undef”的原因是Perl认为
$dir
是对象,并且缺少值(因此
undef
),它显然在注意到
$dir
不是对象之前进行了检查。

我现在已取消删除您的答案。。。也许你应该重新措辞,这样它就不会(再次)因为看起来像一条评论而被删除。还有一句有趣的话:啊,谢谢!我认为我们不应该对这种语言过于拘泥,以至于删除那些显然是为了寻求答案的反问句。
$self->$setter($dir);