2016-04-15 7 views
1

私の質問は次のとおりです:perl Mooを使ってオブジェクトを作成するnew()メソッドを呼び出すときにサブルーチンを使って配列を作成します。次の例を参照してください。perlを使ってnew()メソッドでサブルーチンを使う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; 

基本的に、私は、データベースから、いくつかの電子メールを取得しようとしている、と私は次のコマンドを実行したときので、クエリやDBアクセスを心配しないでください:

my $cc= Customer->new(id=>92,type=>'xxxxxxx'); 
@emails=$cc->getEmails(); 

結果を中@電子メールが期待されます。しかし、ときに私が実行します。

my $cc= Customer->new(id=>92,type=>'xxxxxxx'); 
@emails=$cc->emails; 

私も結果を持っていません。

私はこの質問に答えると非常に感謝します。先輩に感謝します。

答えて

4

あなたは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引数をemails属性に追加することをお勧めします。呼び出した場合にのみ初期化されます。

+0

'getEmails'は' type'に依存しているため、この場合 'lazy'を' 1'に設定しなければなりません:docs:*デフォルトでnew()中に起動された場合、あなたはその存在に頼るべきではないので、まだ人口になっています*)。さらに、 'builder'パラメータは、中間体を使用する代わりに直接' getEmails'に設定することができます。 – polettix

+0

あなたは最高の男です!私はあなたの答えのおかげで問題を解決しました。私はそれを多く感謝します。 – ccalderon911217

+0

@ ccalderon911217あなたは上記のチェックマークをクリックして回答を受け入れることができます。これにより、この問題を抱えている将来のユーザーにはこれがあなたの問題を解決したことが分かります –

関連する問題