在 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)}
这部分很奇怪。您正在尝试通过 @{}
取消引用列表。那是行不通的。
grep
return已经是一个列表。您不需要使用括号 ()
来构造新列表。 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
循环。那么您的第二个列表将是对象的实际标识符,而不是对象本身。
此问题接续以下问题:
my @aIdentList=("z003","t302","p032");
my $lc=List::Compare->new('-u',\@aIdentList,\@{(grep {$_->Identifier}@aArray1)});
my @unique=$lc->get_unique;
\@{(grep {$_->Identifier}@aArray1)}
这部分很奇怪。您正在尝试通过 @{}
取消引用列表。那是行不通的。
grep
return已经是一个列表。您不需要使用括号 ()
来构造新列表。 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
循环。那么您的第二个列表将是对象的实际标识符,而不是对象本身。