2016-08-19 6 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"로 테스트 됨.

약속이 작성된 후에 $myID2이되어 현재의 에코를하는 약속이 무엇인지 알려주는 방법이 없습니다. 모든 약속에서 $myID이 사용 된 것 같습니다. 개별 약속과 관련된 변수를 만드는 방법이 있습니까?

답변

3

실제로는 $myID이 필요하지 않습니다. 이미 루프 블록으로 범위가 지정되었으므로 약속에 $index을 사용할 수 있습니다. 내가 no strict를 사용하는 것이 매우 필요 것 같다 지적하는 충동을 느낄의

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; 

이 알아서과 함께 : 여기에 작업 수정 (에 ..with 엄격한는)입니다. 이와 같은 이상한 범위 문제에 대해 열어 줄뿐만 아니라, 기본적으로 사용자가 취하는 일에서 아무것도 얻지 못합니다.

수정되지 않은 코드에서 strict를 다시 사용하고 두 개의 컴파일 오류를 수정하면 총 4 건의 키 입력 만 저장됩니다. 여기에서 질문을 입력하는 데 사용한 키가 많을뿐입니다.

+1

Timbus! 찍은 조언! – lisprogtor

7

no strict으로 가면 "잃어 버리는 것"중 하나입니다.

필요한 것은 어휘 범위입니다. my을 사용하면 블록 ({ ... })을 입력 할 때마다 다른 변수가 표시됩니다.

당신이 할 경우이 :

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

그런 $myIDstart 블록 및 그 블록은, 그것의 ID를 기억할를 호출 할 때마다 로컬 될 것입니다. 따라서 소켓이 데이터를 수신 할 때마다 올바른 ID를 얻습니다.

+2

감사합니다. 너 내가 문제를 해결하도록 도와 줬어. 다시 한 번 감사드립니다! "내"를 더 자주 사용하려고합니다 :-) – lisprogtor

+1

@lisprogtor : 문제가 해결되면 답변을 수락하십시오. – zb226

+0

zb226 감사합니다! 답변을 수락했습니다! – lisprogtor