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

using List::Compare on an array of Moose Objects

此问题接续以下问题: 我正在努力将 grep 语法实现到 List::Compare 对象中:

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

这部分很奇怪。您正在尝试通过 @{} 取消引用列表。那是行不通的。

grepreturn已经是一个列表。您不需要使用括号 () 来构造新列表。 Perl 将忽略它们。那你的 @{} 就完全错了。您需要一个新的数组引用。那是 []。它将从 grep returns 的列表构造一个新的数组 ref。这已经足以传递给 List::Compare->new。反斜杠 \ 仅在您想引用某物时才需要,但您现在已经有了引用。

但你其实不想grep这里。你想要 map!

这就是您的代码的样子。

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

grep 将过滤掉您传入的列表中块没有 return 真值的每个元素。由于 @aArray1 中的所有对象(输入这太可怕了!)都有一个 Identifier 属性,这将使所有元素通过。 new 的第二个数组 ref arg 将是一个对象列表。这不是您想要的,因为您会将苹果与橙子进行比较。

相反,您需要使用 map,它将为每个元素传递块的 return 值。这就像一个内联 foreach 循环。那么您的第二个列表将是对象的实际标识符,而不是对象本身。