2011-03-03 51 views
3

我正在使用select與TCP服務器。我想將STDIN添加到選擇的文件句柄集中。perl - 檢查文件句柄是否爲std

#!/usr/bin/perl 

use IO::Select; 
use IO::Socket::INET; 
my $sock = IO::Socket::INET->new(LocalPort => $serv_listen_port, Proto => 'tcp', List en=> 1); 

my $s = IO::Select->new(); 
$s->add(\*STDIN); #want to be responsive to user input (allow me to type commands for example) 
$s->add($sock); 

@readytoread=$s->can_read(1); #timeout = 1sec 
foreach $readable (@readytoread) { 
    if ($readable==$sock) { 
    #This was a listen request, I accept and add new client here 
    } 
    if ($readable == STDIN){ #what to do on this line? 
    #This is user typing input into server on terminal 
    } 
} 

在這裏的代碼中需要幫助第4到最後一行。

回答

5
$readable->fileno == fileno STDIN 

或者,如果你感到滿意的是,fileno STDIN是零,您可以直接檢查。

2

can_read返回傳遞給add的精確值,所以你可以簡單地使用

$readable == \*STDIN 
+0

有人能解釋的使用/背後的故事'\ * STDIN'?整個字符串是一種常量?爲什麼是反斜槓?它逃避了星號嗎? – 2011-03-07 17:50:07

+2

@Steven Lu:STDIN是一個全局文件句柄。因爲它沒有sigil,所以不能直接在任何地方使用它,否則Perl會將其解釋爲字符串或函數調用。星號是typeglob sigil(typeglobs可以被認爲包含文件句柄以及其他變量類型),並且反斜槓會引用該類型塊。 'IO :: Select'知道它需要一個文件句柄,因此它可以在需要時解引用它。查看'perldata'的「Typeglobs和filehandles」部分以獲得更全面的視圖。 – 2011-03-07 20:05:34