Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/12.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 Moo在new()方法中使用子例程_Perl_Oop_Constructor_Moo - Fatal编程技术网

使用perl Moo在new()方法中使用子例程

使用perl Moo在new()方法中使用子例程,perl,oop,constructor,moo,Perl,Oop,Constructor,Moo,我的问题如下:当我调用new()方法来使用perl Moo创建对象时,我想使用一个子例程来构造一个数组。请参见下面的示例 package Customer; use DBI; use 5.010; use Data::Dumper; use Moo; use FindBin qw/$Bin/; use lib "$Bin/../../../lib"; use lib '/home/fm/lib'; use TT::SQL; has id => ( is=>'ro', req

我的问题如下:当我调用new()方法来使用perl Moo创建对象时,我想使用一个子例程来构造一个数组。请参见下面的示例

package Customer;
use DBI;
use 5.010;
use Data::Dumper;
use Moo;
use FindBin qw/$Bin/;
use lib "$Bin/../../../lib";
use lib '/home/fm/lib';
use TT::SQL;

has id => (
  is=>'ro',
  required=>1,
);

has type => (
  is=>'ro',
);

has emails => (
  is=>'rw',
  isa => sub {getEmails() },
);

sub getEmails
{
                #connecting into de DB
                my $self=shift;
                my $db2 = TT::SQL::get_handler("xxxxxx","xxxxx");
                my $fmuser=$self->id;
                my $type=$self->type;
                my $query;
                #checking the customer type to perform the query
                if ($type eq "xxxxxxxxxx")
                {
                $query=xxxxxxxxxxxxxx;
                }
                else
                {
                $query=xxxxxxxxxxxxxx;
                }
                my $ref = $db2->execute($query,$fmuser);
                my @emails;
                #retrieving emails
                while ( my $row = $ref->fetchrow_hashref  ) {
                       @emails=(@emails,"$row->{email}\n");
                  }
                return @emails;
}

1;
基本上,我正在尝试从数据库检索一些电子邮件,不必担心查询和数据库访问,因为当我执行以下操作时:

my $cc= Customer->new(id=>92,type=>'xxxxxxx');
@emails=$cc->getEmails();
@email中的结果是预期的。但是,当我执行时:

my $cc= Customer->new(id=>92,type=>'xxxxxxx');
@emails=$cc->emails;
我甚至没有结果


如果我能得到这个问题的答案,我将不胜感激。提前感谢各位。

如果要使用生成器方法或默认方法,isa用于强制执行类型约束:

默认值:

has emails => (
  is      => 'rw',
  default => sub { 
     my ($self) = @_;
     return $self->getEmails();
  },
);
建造商:

has emails => (
  is      => 'rw',
  builder => '_build_emails',
);

sub build_emails {
    my ($self) = @_;

    return $self->getEmails();
}

如果
getEmails()
子例程需要任何额外的启动时间(例如获取数据库句柄),我还建议将
lazy=>1
参数添加到电子邮件属性中。这将仅在调用时对其进行初始化。

如果要使用生成器方法或默认值,isa用于强制执行类型约束:

默认值:

has emails => (
  is      => 'rw',
  default => sub { 
     my ($self) = @_;
     return $self->getEmails();
  },
);
建造商:

has emails => (
  is      => 'rw',
  builder => '_build_emails',
);

sub build_emails {
    my ($self) = @_;

    return $self->getEmails();
}

如果
getEmails()
子例程需要任何额外的启动时间(例如获取数据库句柄),我还建议将
lazy=>1
参数添加到电子邮件属性中。这只会在调用时初始化它。

lazy
在这种情况下必须设置为
1
,因为
getEmails
依赖于
type
(来自文档:注意,如果在new()期间触发默认值,则无法保证其他属性已经填充,因此您不应该依赖它们的存在。)。此外,
builder
参数可以直接设置为
getEmails
,而不是使用中间值。你是最棒的家伙!多亏了你的回答,我已经解决了我的问题。我非常感谢。@ccalderon911217您可以通过单击上面的复选标记来接受答案,这将让有此问题的未来用户知道这解决了您的问题。在这种情况下,
lazy
必须设置为
1
,因为
getEmails
依赖于
type
(从文档中:请注意,如果在new()期间触发默认值,则无法保证其他属性已填充,因此您不应依赖它们的存在。)。此外,
builder
参数可以直接设置为
getEmails
,而不使用中间值。你们是最棒的人!由于你们的回答,我已经解决了我的问题。我非常感谢。@ccalderon911217您可以通过单击上面的复选标记来接受答案,这将让有此问题的未来用户可以选择现在这解决了你的问题