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"; 

OUTPUT:Perlサブルーチンの復帰配列とstrが、彼らはマージなっている

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

EXPECTED:

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

なぜ$last_recevied@linesにマージされたのですか?
どうすれば外側のfuncで分割できますか?

答えて

4

関数はフラットリストを返します。配列が割り当てられている変数のリストの最初にある場合、リスト全体がその配列に入ります。だから

@linesは、返されたすべてを取得します。

ソリューション

  • 戻りスカラーとともに配列への参照ので、2つのスカラー

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

    に割り当てるIは、一般的に、このアプローチをお勧めします。常に返され$last_receivedので

  • は、割り当てのでリターンと割り当て

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

順序を入れ替えることリターンから最初の一つの値だけがこれにした後、他の割り当てられたスカラーであります次の変数に入ります。ここでは配列@linesであり、残りのすべての戻り値が必要です。

関連する問題