在Moose对象数组上使用List :: Compare

时间:2017-09-08 12:53:04

标签: arrays perl grep moose

此问题接替以下问题: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;

1 个答案:

答案 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循环。然后你的第二个列表将是对象的实际标识符,而不是对象本身。