2017-09-08 7 views
0

cette question succède à la question suivante: Moose: Array of Objects->loop through Attribute Je me bats pour mettre en œuvre la syntaxe grep dans une liste :: Comparer objet:en utilisant Liste :: Comparer sur un tableau de Moose Objets

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

Je ne comprends pas la question. Que veux-tu faire exactement? – simbabque

+0

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

Répondre

4
\@{(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.