2016-09-15 5 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"; 

출력 :펄 서브 루틴 반환 배열 및 STR하지만 그들은 합병지고

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은 하위가 반환 한 모든 것을 가져옵니다.

솔루션

  • 반환 스칼라와 함께 배열에 대한 참조

    , 그래서 내가 일반적으로,이 방법을 추천 할 것 두 스칼라

    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, 모든 나머지 반환 소요됩니다.