2014-10-09 16 views
3

我想讀取套接字並對它們執行「getline」。

my @socket1; 
$socket1[0] = IO::Socket::INET->new(
    Type  => SOCK_STREAM, 
    PeerAddr => "127.0.0.1", 
    Proto => "tcp", 
    PeerPort => $dbase_param{camera_stream} 
) or die "Cannot open socket on port " . $dbase_param{camera_stream} . ".\n"; 

print { $socket1[0] } "\n"; 
my $ligne = <$socket1[0]>; 

while (!($ligne =~ /Content-Length:/)) { 
    $ligne = <$socket1[0]>; 
} 

它會告訴我Use of uninitialized value $ligne in pattern match (m//)第二$ligne = <$socket1[0]>;

我不明白WY

回答

5

尖括號也用於​​3210,

perl -MO=Deparse -e '$ligne = <$socket1[0]>;' 
use File::Glob(); 
$ligne = glob($socket1[0]); 

所以如果你是不使用普通標量作爲套接字,可以通過使用readline(),

$ligne = readline($socket1[0]); 
2

I/O Operator <EXPR>可能意味着取決於EXPRreadlineglob

在這種情況下,您需要使用明確的readline才能完成您想要的功能。

此外,您應該始終執行while循環中的句柄讀取,並將任何其他流邏輯放入循環中。這是因爲從文件讀取的while循環將自動檢查eof條件。你的代碼當前編寫的方式,如果它永遠找不到正則表達式,最終可能會出現無限循環。

要解決這兩個問題,因此,我會重寫你處理以下幾點:

my $ligne; 

while ($ligne = readline $socket1[0]) { 
    last if $ligne =~ /Content-Length:/; 
}