2016-09-15 4 views
1
sub process_feed { 
    my ($line) = @_; 

    my @lines; 
    my $last_received = ""; 

    while (1) { 
     if ($line =~/^{(.*?)}(.*)/) { 
      push @lines, $1; 
      $line = $2; 
     } else { 
      $last_received = $line; 
      last; 
     } 
    } 

    print "sending back @lines, $last_received\n"; 

    return (@lines, $last_received); 
} 

my (@lines, $leftover) = process_feed("{hi1}{hi2}{hi3"); 
print "got lines: @lines\n"; 
print "got last_recevied, $leftover\n"; 

ВЫВОД:Perl подпрограммы возвращение массива и Обл, но они становятся сливались

sending back hi1 hi2, {hi3 
got lines: hi1 hi2 {hi3 
got last_recevied, 

ОЖИДАЕТСЯ:

sending back hi1 hi2, {hi3 
got lines: hi1 hi2 
got last_recevied, {hi3 

$last_recevied почему сольются в @lines?
как разбить их во внешнем func?

ответ

4

Функция возвращает плоский список. Если массив присваивается первым в списке переменных, весь список переходит в этот массив. Так в

my (@lines, $leftover) = process_feed("{hi1}{hi2}{hi3"); 

@lines получает все, что к югу возвратили.

Solutions

  • возвращает ссылку на массив вместе с скаляр, поэтому назначить двух скаляров

    sub process_feed { 
        # ... 
        return \@lines, $last_received; 
    } 
    my ($rlines, $leftover) = process_feed("{hi1}{hi2}{hi3"); 
    print "got lines: @$rlines\n"; 
    

    Я рекомендовал бы этот подход, в общем.

  • С $last_received всегда возвращается, поменять порядок возврата и назначение

    sub process_feed { 
        # ... 
        return $last_received, @lines; 
    } 
    my ($leftover, @lines) = process_feed("{hi1}{hi2}{hi3"); 
    

Поскольку задания является скаляр первым только одно значение из возвращения присвоенной ему, а затем другие перейти к следующим переменным. Здесь находится массив @lines, который берет все оставшееся возвращение.