\@{(grep {$_->Identifier}@aArray1)}
Cette partie est bizarre. Vous essayez de déréférencer une liste via @{}
. Ça ne marche pas. Le grep
renvoie une liste déjà. Vous n'avez pas besoin d'utiliser la parenthèse ()
pour construire une nouvelle liste. Perl les ignorera. Alors votre @{}
est simplement faux. Vous avez besoin d'une nouvelle référence de tableau. C'est []
. Il va construire un nouveau tableau ref dans la liste qui renvoie grep
. C'est déjà suffisant pour passer à List::Compare->new
. La barre oblique inverse \
est seulement nécessaire si vous voulez prendre une référence de quelque chose, mais vous avez déjà une référence.
Mais vous ne voulez pas vraiment grep
ici. Vous voulez map
!
Voici à quoi devrait ressembler votre code.
List::Compare->new('-u', \@aIdentList, [ map { $_->Identifier } @aArray1 ])
grep
filtrera tous les éléments de la liste que vous passez où le bloc ne renvoie pas de valeur réelle. Puisque tous les objets dans @aArray1
(en tapant c'est horrible!) Ont une propriété Identifier
, cela laissera passer tous les éléments. Le deuxième argument ref de tableau à new
sera alors une liste d'objets. Ce n'est pas ce que tu veux, parce que tu compares des pommes à des oranges.
Au lieu de cela, vous devez utiliser map
, qui transmettra la valeur de retour du bloc pour chaque élément. C'est comme une boucle en ligne foreach
. Ensuite, votre deuxième liste sera les identifiants réels des objets, et non les objets eux-mêmes.
Je ne comprends pas la question. Que veux-tu faire exactement? – simbabque
J'ai un Array @ aIdentList avec les identifiants et l'autre Array avec le TestObject. Je veux comparer les identifiants dans le premier tableau avec l'attribute "Identifier" dans le second tableau et obtenir seulement les identifiants uniques dans @ aIdentList écrits dans le tableau @ unique. – airborne