2011-12-28 4 views
3

그래서 while 루프를 사용하여 소켓을 반복하면서이 문제가 발생합니다.chomp()를 사용하면 인쇄가 실패합니다.

내가 이것을 사용하면 완전히 작동하지만 나는 원하지 않는 모든 $message에 줄 바꿈을했다.

my $socket = new IO::Socket::INET (
    LocalHost => "127.0.0.1", 
    LocalPort => "12345", 
    Proto => 'tcp', 
    Listen => 1, 
    Reuse => 1 
); 
my $client = $socket->accept(); 
while(<$client>) { 
    my $message = $_; 
    print $message; 
} 

하지만 (나는 이유를 이해) 클라이언트 연결을 끊을 때 나는 루프는 완료 씹는을 추가 할 때. 내 생각에 chomp는 $_ 변수에서 개행을 제거하므로 루프가 더 이상 작동하지 않습니다.

my $socket = new IO::Socket::INET (
    LocalHost => "127.0.0.1", 
    LocalPort => "12345", 
    Proto => 'tcp', 
    Listen => 1, 
    Reuse => 1 
); 
my $client = $socket->accept(); 
while(<$client>) { 
    my $message = $_; 
    chomp($message); 
    print $message; 
} 

그래서 제 질문은 : 소켓을 통해 I 루프 (줄 바꿈 종료) 어떻게 메시지에 줄 바꿈을하지 않고?

감사합니다.

답변

5

chomp$_ 복사본에 있으므로 소켓 핸들에 전혀 영향을 미치지 않습니다. 더 많은 경우, 개행을 제거하면 버퍼에서 print 문을 기다리고 스크립트가 종료되면 실행됩니다.

다른 말로하면 : 오류가 아니라 단지 지연입니다.

즉시 인쇄하려면 autoflush을 사용해보십시오.

$| = 1; 
+0

좋아, 내가 알아 낸 것은 $ 메시지를 출력 할 때이다. "\ n"; 작동합니다. 관련이 있습니까? –

+0

답변을 주셔서 감사합니다. 솔루션이 효과적이었습니다. 지금 궁금한 Im, 다른 루프에서도 처리 할 수 ​​있습니까? –

+1

@JamieFlowers 무언가를'인쇄 '하면 쉘의 인쇄 버퍼로 보내집니다. 이 버퍼는 개행이 나타날 때까지 실제로 인쇄되지 않습니다. 실제 오류가 아니라 단지 지연입니다. – TLP

관련 문제