2017-09-08 10 views
1

私はPerl Mooseを使い慣れていません。この単純な作業を達成しようとしています。私は私のムースクラス「TestObject」が定義されている:Moose:オブジェクト - >ループを介した属性の配列

私は「TestObjects」の配列から直接属性「識別子」にアクセスしようとしている別のスクリプトで
package TestObject; 
use Moose; 
use namespace::autoclean; 

has 'Identifier' => (is =>'ro',isa=>'Str'); 

around BUILDARGS => sub 
{ 
    my $orig = shift; 
    my $class = shift; 

    if (@_ == 1 && ! ref $_[0]) { 
     return $class->$orig(Identifier => $_[0]); 
    } 
    else { 
     return $class->$orig(@_); 
    } 
}; 
__PACKAGE__->meta->make_immutable; 
1; 

:これは「doesnの

use TestObject; 
use experimental 'smartmatch'; 
my @aArray1=(TestObject->new("z003"),TestObject->new("t302"),TestObject->new("r002")); 
my $sIdent="t302"; 
if([email protected]>Identifier) 
{ 
    print "Element with Identifier".$sIdent." found."; 
} 

仕事。私はこのような回避策を実装することができます:

my @aIdent=(); 
foreach my $sObject(@aArray1) 
{ 
    push(@aIdent,$sObject->Identifier); 
} 
if([email protected]) 
{ 
    print "Element with Identifier".$sIdent." found."; 
} 

しかし、それは最もエレガントな解決策ではないようです。この問題を解決する最も洗練されたソリューションは何ですか?

+4

クラス名を_Object_にしないでください。それは本当に混乱しています! – simbabque

+3

私はsmartmatch operator_を使用していないと言います。これは実験的なもので、ある時点で最終的には変更されたり投げ捨てられたりする可能性があります。 – simbabque

答えて

4

smartmatchオペレータではこれを行わないでください。実験的な理由から、将来のPerlのバージョンから削除されるか、以前のように動作する方法を変更する可能性があります。

代わりに、これは簡単なgrepで実現できます。

my @aArray1 = ( 
    TestObject->new("z003"), 
    TestObject->new("t302"), 
    TestObject->new("r002"), 
); 

my $sIdent = "t302"; 
if (grep { $_->Identifier eq $sIdent } @aArray1) { 
    print "Element with Identifier" . $sIdent . " found."; 
} 

あなたはそれが少し短くなるようにしたい場合は、first from List::Utilを使用することができます。これは、最初の試合を見直すのが止まるので少し速くなります。

use List::Util 'first'; 
my @aArray1 = ( 
    TestObject->new("z003"), 
    TestObject->new("t302"), 
    TestObject->new("r002"), 
); 

my $sIdent = "t302"; 
if (first { $_->Identifier eq $sIdent } @aArray1) { 
    print "Element with Identifier" . $sIdent . " found."; 
} 

あなたのコード上のアドバイスのいくつかの単語:

  • は今までオブジェクトを持つクラスの任意の名前を付けるしないでください。それはあなた、将来あなたとメンテナンスを混乱させるでしょう。 クラスオブジェクトの違いを理解できない場合は、それをお読みください。
  • Perlの変数名と関数は、慣例により常に小文字で記述されており、スネークケースを使用しています。キャメルケースはパッケージ名のために予約されています。
+2

"オブジェクトにクラス名を指定しないでください。"私の最初の仕事の1つは、データモデリングツールのデータベース生成コンポーネントで作業していたことです。私たちのデータベースには、 "データベース"、 "テーブル"、 "カラム"というテーブルがありました。 **非常に混乱していた**! –

+0

@simbabque:あなたの答えはThxです。はい、私はクラスとオブジェクトの違いを知っている、ちょうどstackoverflowに投稿するためのこのコードスニペットを書いた。同様の問題で私を助けてくれますか?私はgrepの構文をList :: Compareオブジェクトに実装するのに苦労しています:my $ lc = List :: Compare-> new( '-u'、\ @ aIdentList、\ @ {(grep {$ _-> Identifier} @ aArray1)}); – airborne

+1

@airborneちょっと新しい質問をお願いします。 – simbabque

関連する問題