2017-09-08 1 views
0

オブジェクト:私はリストにはgrepの構文を実装するために苦労しています::オブジェクトを比較Moose: Array of Objects->loop through Attribute を:リストを使用して::ムースの配列に比較すると、この問題は、次の質問に成功

my @aIdentList=("z003","t302","p032"); 
my $lc=List::Compare->new('-u',\@aIdentList,\@{(grep {$_->Identifier}@aArray1)}); 
my @unique=$lc->get_unique; 
+0

質問が分かりません。あなたは正確に何をしたいですか? – simbabque

+0

私は識別子を持つArray @ aIdentListとTestObjectを持つもう一つのArrayを持っています。私は最初の配列の識別子を2番目の配列の "識別子"属性と比較し、@ unique配列に書かれた@ aIdentListで一意の識別子だけを取得したいと考えています。 – airborne

答えて

4
\@{(grep {$_->Identifier}@aArray1)} 

この部分は奇妙です。あなたは@{}でリストを間接参照しようとしています。それは動作しません。

grepは既にリストを返します。新しいリストを作成するには、括弧()を使用する必要はありません。 Perlはそれらを無視します。その後、あなたの@{}は間違っています。新しい配列参照が必要です。それは[]です。 grepが返すリストから新しい配列refを構築します。それは既にList::Compare->newに渡すには十分です。バックスラッシュ\は、何かのリファレンスを取りたい場合にのみ必要ですが、すでにリファレンスがあります。

実際にはgrepは欲しくないです。あなたはmapしたい!

これはコードの外観です。

List::Compare->new('-u', \@aIdentList, [ map { $_->Identifier } @aArray1 ]) 

grepあなたはブロックが真の値を返さない場合に渡したリストのすべての要素を除外します。 @aArray1のすべてのオブジェクト(これは恐ろしいです!)はIdentifierというプロパティを持っているので、これはすべての要素を通過させます。 newへの2番目の配列ref argは、オブジェクトのリストになります。それは、あなたがオレンジとリンゴを比較するので、あなたが望むものではありません。

代わりに、mapを使用する必要があります。これは、各要素のブロックの戻り値を渡します。それはインラインforeachループのようなものです。次に、2番目のリストは、オブジェクト自体ではなく、オブジェクトの実際の識別子になります。

関連する問題