2013-05-28 3 views
1

Таким образом, все я хочу сделать, это передать массив в функцию (или подпрограммы) в PERLPerl: Проблема прохождения массива функционировать

Так @Temp содержит 2 массивы [0] = {xx,xx,xx,xx,xx} [1] = {xx,xx,xx,xx,xx}

#returns array containing two arrays 

my @temp = $lineParser->parseLine($_); 

@handOne = $cardFactory->createHand(@Temp[0]); 
@handTwo = $cardFactory->createHand(@Temp[1]); 

Это метод createHand которым содержатся в отдельном классе (или пакете или любом другой)

sub createHand 
{ 
    my $self = shift; 
    my @temp = @_; 
    my @arrayOfCards; 
    foreach(@temp) 
    { 
     my $value = substr($_,0,1); 
     my $color = substr($_,1,1); 

     push(@arrayOfCards,new Card($value,$color)); 
    } 

    return @arrayOfCards; 
} 

проблемы я имею что массив получает р assed, но содержит ARRAY(XXXXX) в начале массива. . {0 ARRAY(xxxxxx), 0 'xx', 1 'xx', ...}

Почему это происходит?

Как я могу это сделать правильно?

+0

Это опечатка, или у вас есть две переменные с именем '@ temp' и' @ Temp' , Потому что это две разные переменные. – TLP

ответ

4

Если вы включите warnings, вы получите следующий:

Scalar value @Temp[0] better written as $Temp[0] 

Если вы хотите передать ссылочный массив по значению, вы должны разыменовать ему:

@handOne = $cardFactory->createHand(@{ $Temp[0] }); 
+0

Спасибо, казалось, исправить проблему, с которой я столкнулся. – BuildingJarl

+0

Вы могли бы объяснить, что означает @ {$ Temp [0]}? – BuildingJarl

+0

Строго говоря '@ {$ Temp [0]}' не передает массив :) –

1

Вы передаете ссылку вместо значения.

my @temp = $lineParser->parseLine($_); 

@handOne = $cardFactory->createHand($Temp[0]); 
@handTwo = $cardFactory->createHand($Temp[1]); 

так в двух словах изменения @temp[0] к $temp[0] при переходе от аргумента

+0

Ничего страшного, но это неверно – BuildingJarl

2
sub createHand 
{ 
    my $self = shift; 
    my ($temp) = @_; 
    my @arrayOfCards; 
    foreach(@$temp) 
    { 
     my $value = substr($_,0,1); 
     my $color = substr($_,1,1); 

     push(@arrayOfCards,new Card($value,$color)); 
    } 

    return @arrayOfCards; 
} 

Также примите к сведению, что @temp [0] является массивом ломтика в случае, когда скалярная (массив ссылок) разыскивается, так это лучше заявить правильное намерение:

@handOne = $cardFactory->createHand($temp[0]); 
+0

Нет. Srry, но thats not correct – BuildingJarl

+0

У вас есть два варианта, передающих функцию 'array' или' list of values'. Вышеприведенный пример передает массив, как вы заявили в вопросе. –

+0

@ {$ Temp [0]} решил мою проблему, и $ Temp [0], похоже, не работает – BuildingJarl

Смежные вопросы