2017-09-14 9 views
1

私はaTestCaseListという配列を持っています。この配列は初期化され、 "Testcase"型の(Moose)オブジェクトで埋められています。予想どおり、私はの属性TestcaseaTestCaseListに印刷することができます。私はhttps://perldoc.perl.org/List/Util.html#firstを使用して「TEST4」という名前のリストの最初のオブジェクトを検索しようとすると、しかし、私は、なぜ次のエラーList :: UtilをまずMooseオブジェクトの配列に使用する

は未定義値で「テスト名」

のメソッドを呼び出すことはできません取得します配列のオブジェクトが突然未定義ですか?

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; 

答えて

4

あなたははい、あなたは正しいです

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

ようList::Utilから機能firstをインポートするのを忘れました。私はエラーメッセージを間違って解釈したと思います。何らかの理由でオブジェクト自体が定義されていないと思った。 – airborne

+2

'first {$ _-> TestName eq $ sTestcase} @ aTestcaseList'の宣言が '(do {$ _-> TestName eq $ sTestcase}) - >最初の(@aTestcaseList)'として解釈されました。間接メソッド呼び出し。 '$ _'は定義されていないので、' $ _-> TestName'はそのエラーを投げました。 – ikegami

関連する問題