[英]How does Perl know how many bytes to read in a handle from IO::Select::->can_read?
我正在使用IO::Select
的can_read
方法來選擇准備在簡單的perl腳本中讀取的文件句柄。
但是,文件句柄上的<...>
運算符不需要將長度傳遞給它。
IO::Select
到達文件句柄內部以設置“適當的長度” ...還是發生了什么?
#!/usr/bin/env perl
use IO::Select;
use strict;
use warnings;
my @handles = IO::Select->new(\*STDIN)->can_read(3);
@handles == 1 or die;
my $handle = $handles[0];
print ("I read " . <$handle> . "\n");
例如,以下腳本立即打印"a\\n"
,然后在三秒鍾后退出。
% sh -c 'echo a; sleep 5; echo b' | perl reader.pl
I read a
Exit 141
然后由於某種奇怪的原因而異常退出……不確定退出狀態在哪里設置。
編輯:明顯的異常退出似乎是tcsh中的錯誤。
IO :: Select都不知道長度, <...>
運算符或readline
函數也不知道。 取而代之的是,它將嘗試讀取直到行末的內容。 如果未找到行尾字符(即$/
),則在非阻塞文件句柄的情況下,它將僅返回所有可用數據;在阻塞文件句柄的情況下,將等待至行尾或數據結尾。
在您的特定情況下, echo a; sleep 5; echo b
echo a; sleep 5; echo b
echo a; sleep 5; echo b
導致a\\n
而5秒后返回b\\n
。 由於您的代碼在標量上下文中使用<..>
,因此它將僅讀取一行。 這意味着它將在找到第一行結束后停止並返回此行,從而導致a\\n
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.