2011-12-28 39 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; 
} 

所以我的問題是:我如何遍歷插座(新行終止),而無需在消息中的新行?

非常感謝!

回答

5

chomp是在$_的副本上製作的,所以它根本不應該影響套接字句柄。更有可能的是,刪除換行符讓您的打印語句在緩衝區中等待,並在腳本終止後執行。

換句話說:這不是一個錯誤,只是一個延遲。使用autoflush立即執行打印。

$| = 1; 
+0

好吧,所以我發現是當我打印$消息。「\ n」;它的工作原理是 。 它與此有關嗎? –

+0

感謝您的答案,您的解決方案工作。我想知道現在,它會與其他循環一起進行處理嗎? –

+1

@JamieFlowers當你打印某些東西時,它會被髮送到shell中的打印緩衝區。直到出現換行符時纔會實際打印此緩衝區。這不是一個真正的錯誤,只是一個延遲。 – TLP