2017-09-14 5 views
1

J'ai un tableau appelé aTestCaseList qui est initialisé et rempli d'objets (Moose) de type "Testcase". Comme prévu, je peux imprimer l'attribut TestName de chaque objet Testcase dans aTestCaseList. Mais lorsque je tente de trouver le premier objet dans la liste nommée « Test4 » à l'aide https://perldoc.perl.org/List/Util.html#first je reçois l'erreur suivanteUtilisation de List :: Util premier sur un tableau d'objets Moose

peut appeler la méthode « TestName » sur une valeur non définie

Pourquoi la objets dans le tableau soudainement indéfini?

use Testcase; 

my @aTestcaseList=(); 
for (my $i=1; $i <= 9; $i++) { 
    push(@aTestcaseList,Testcase->new("Test".$i)); 
} 
my $sTestcase="Test4"; 
foreach my $sTestDummy(@aTestcaseList) 
{ 
    #Works as expected and prints: Test1 Test2 Test3 ... Test9 
    print $sTestDummy->TestName." "; 
} 
# throws the error: 
my $sFindTest=first {$_->TestName eq $sTestcase} @aTestcaseList; 

package Testcase; 
use Moose; 
use namespace::autoclean; 

has 'TestName' => (is =>'ro',isa=>'Str'); 

around BUILDARGS => sub 
{ 
    my $orig = shift; 
    my $class = shift; 

    if (@_ == 1 && ! ref $_[0]) { 
     return $class->$orig(TestName => $_[0]); 
    } 
    else { 
     return $class->$orig(@_); 
    } 
}; 
__PACKAGE__->meta->make_immutable; 
1; 

Répondre

4

Vous avez oublié d'importer la fonction first de List::Util comme

use List::Util qw(first); 
+0

Oui, vous avez raison. Je pense que j'ai mal interprété le message d'erreur. Je pensais pour une raison quelconque que les objets eux-mêmes n'étaient pas définis. – airborne

+2

Sans une déclaration pour 'first',' first {$ _-> TestName eq $ sTestcase} @ aTestcaseList' a été interprété comme le '(do {$ _-> TestName eq $ sTestcase}) -> first (@aTestcaseList)' appel de méthode indirecte. '$ _' n'est pas défini, donc' $ _-> TestName' a jeté cette erreur. – ikegami