此问题接替以下问题:Moose: Array of Objects->loop through Attribute 我正在努力将grep语法实现为List :: Compare Object:
my @aIdentList=("z003","t302","p032");
my $lc=List::Compare->new('-u',\@aIdentList,\@{(grep {$_->Identifier}@aArray1)});
my @unique=$lc->get_unique;
答案 0 :(得分:4)
\@{(grep {$_->Identifier}@aArray1)}
这部分很奇怪。您正试图通过@{}
取消引用列表。这不起作用。
grep
已经返回一个列表。您不需要使用括号()
来构造新列表。 Perl会忽略它们。然后你的@{}
完全错了。您需要一个新的数组引用。那是[]
。它将从grep
返回的列表构造一个新的数组引用。这已经足够传递给List::Compare->new
了。只有当您想要引用某些内容时才需要反斜杠\
,但您现在已经有了引用。
但实际上你不想在这里grep
。你想要map
!
这就是你的代码应该是什么样子。
List::Compare->new( '-u', \@aIdentList, [ map { $_->Identifier } @aArray1 ] )
grep
将过滤掉传递的列表中的每个元素,其中块不返回true值。由于@aArray1
中的所有对象(输入此内容非常糟糕!)都有Identifier
属性,因此这将允许所有元素通过。然后,第二个数组引用new
将是一个对象列表。那不是你想要的,因为你要比较苹果和橘子。
相反,您需要使用map
,它将为每个元素传递块的返回值。它就像一个内联foreach
循环。然后你的第二个列表将是对象的实际标识符,而不是对象本身。