2016-08-19 11 views
3

約束事で動作している3台のエコーサーバーをコーディングしようとしていますが、どのような約束がエコーをしているのかを知りたいと思います。それを行う方法はありますか?perl6約束の特定のアイデンティティーを取得する方法は?

no strict; 

for 0 .. 2 -> $index { 
    @result[$index] = start { 
     $myID = $index; 
     say "======> $myID\n"; 

     my $rsSocket = IO::Socket::INET.new: 
      localhost => 'localhost', 
      localport => 1234 + $index, 
      listen => 1; 

     while $rsSocket.accept -> $rsConnection { 
      say "Promise $myID accepted connection"; 
      while $rsConnection.recv -> $stuff { 
       say "promise $myID Echoing $stuff"; 
       $rsConnection.print($stuff); 
      } 
      $rsConnection.close; 
     } 
    } 
} 

await @result; 

エコーサーバーは正常に実行されます。 "nc"でテストした。

問題は$myIDとなります。約束が作成された後に2となり、現在のエコーを行っている約束を知る方法がありません。すべての約束によって、$myIDが使用されているようです。個々の約束に固有の変数を作成する方法はありますか?

答えて

3

$myIDはまったく必要ありません。ループブロックにスコープされているので、約束の中で$indexを使用することができます。ここでは(上の厳格な..with)作業の変更があります:

my @result = do for 0 .. 2 -> $index { 
    start { 
     say "======> $index\n"; 

     my $rsSocket = IO::Socket::INET.new: 
      localhost => 'localhost', 
      localport => 1234 + $index, 
      listen => 1; 

     while $rsSocket.accept -> $rsConnection { 
      say "Promise $index accepted connection"; 
      while $rsConnection.recv -> $stuff { 
       say "promise $index Echoing $stuff"; 
       $rsConnection.print($stuff); 
      } 
      $rsConnection.close; 
     } 
    } 
} 

await @result; 

私はno strictを使用すると、非常に不必要と思われることを指摘する衝動を感じるの注意しながら。このような奇妙なスコープの問題をあなたに残すだけでなく、あなたの例では基本的に何も得られません。

未修正のコードでstrictを再度有効にし、2つのコンパイルエラーを修正すると、合計4回のキーストロークしか保存されませんでした。

+1

Timbusありがとう!取られたアドバイス! – lisprogtor

7

これは、no strictに行くことであなたが「失うもの」の1つです。

必要なものはレキシカルスコープです。 myを使用すると、ブロック({ ... })が入力されるたびに異なる変数が与えられます。

あなたが行う場合は、この:

for 0 .. 2 -> $index { 
    @result[$index] = start { 
     my $myID = $index; 

その後$myIDstartブロック、およびそのブロックが、それはそのIDを覚えているだろう呼び出されるたびにローカルになります。したがって、ソケットがデータを受信するたびに正しいIDを取得します。

+2

ありがとうございます。あなたは私がこの問題を解決するのを手助けしました。再度、感謝します !私はより頻繁に "私"を使用しようとします:-) – lisprogtor

+1

@lisprogtor:あなたの問題を解決したら答えを受け入れてください。 – zb226

+0

ありがとうzb226!回答が受け入れられました! – lisprogtor

関連する問題