Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Moose:在构建方法中从文件加载对象_Perl_Build_Moose - Fatal编程技术网

Perl Moose:在构建方法中从文件加载对象

Perl Moose:在构建方法中从文件加载对象,perl,build,moose,Perl,Build,Moose,我必须在BUILD方法中读取一个文件,我想使用MooseX::Storage包的load方法。 但是这个加载方法创建了一个新的对象,所以当我恢复这个对象时,它不是从文件中读取的对象。在下面的代码中,我创建了一个状态为2的对象$m1来写入文件,我创建了没有参数的$m2来读取文件,但是$m2不包含正确的值。 一揽子计划: package mia; use Moose; use MooseX::Storage; with Storage(format => 'JSON', io => '

我必须在BUILD方法中读取一个文件,我想使用MooseX::Storage包的load方法。 但是这个加载方法创建了一个新的对象,所以当我恢复这个对象时,它不是从文件中读取的对象。在下面的代码中,我创建了一个状态为2的对象$m1来写入文件,我创建了没有参数的$m2来读取文件,但是$m2不包含正确的值。 一揽子计划:

package mia;
use Moose;
use MooseX::Storage;

with Storage(format => 'JSON', io => 'File');

has 'nome'  => ( is     => 'rw', isa    => 'Str', default =>'',);
has 'stato' => ( is     => 'rw', isa    => 'Int', default =>1,);

sub BUILD { 
    my $self=shift;
    if ($self->stato==1){
        $self=mia->load("mia.dat");
    }
    if ($self->stato==2){
        $self->stato(0);
        $self->nome("prova");
        $self->store("mia.dat");    
    }
}

sub stampa(){
    my $self=shift;
    print $self->nome." ".$self->stato;
}
主程序

use mia;
my $m;

$m1=mia->new(stato=>2); 
$m2=mia->new();
print "\nm1 \n";
$m1->stampa();
print "\nm2 \n";
$m2->stampa();

您的代码看起来好像构建是一个构造函数,而事实并非如此——它更像是一个构建后钩子,您可以在其中执行其他操作,比如从DB读取值。您应该:

将mia->load的结果存储在属性中,并可以选择使用委托方法来访问它,或者 使用mia->load的结果作为对象,而不是构建一个单独的对象。 下面是第一种情况的示例,将MooseX::Storage对象与控制它的对象分离:

package miaController;
use Moose;
use mia;

has 'nome'  => ( is     => 'rw', isa    => 'Str', default =>'',);
has 'stato' => ( is     => 'rw', isa    => 'Int', default =>1,);
has 'mia'   => ( is     => 'rw', isa    => 'mia', lazy => 1);

sub BUILD
{
    my $self = shift;
    if ($self->stato == 1)
    {
        $self->mia(mia->load("mia.dat"));
    }
    elsif ($self->stato == 2)
    {
        $self->stato(0);
        $self->nome("prova");
        $self->mia->store("mia.dat");
    }
}
sub stampa
{
    my $self = shift;
    print $self->nome." ".$self->stato;
}

package mia;
use Moose;
use MooseX::Storage;
with Storage(format => 'JSON', io => 'File');

package main:
use miaController;

my $m1=miaController->new(stato=>2);
my $m2=miaController->new();
print "\nm1 \n";
$m1->stampa();
print "\nm2 \n";
$m2->stampa();

谢谢你,但是我如何使用mia->load的结果作为对象呢?如果我写$self->load it generate en error…@Gabriella:您试图将传递到构造函数的状态变量与构造函数为load方法的对象组合在一起-我已将它们拆分为两个。您可能需要重新考虑包/类名。在Perl中,约定是只有pragma应该具有所有小写名称。见佩尔斯泰尔-