|
|
|
|
| [FAQ] 5.1: 我该如何清洗(flush/unbuffer)输出文件句柄(an output |
|
|
|
[Original]
[Print]
[Top]
|
5.1: 我该如何清洗(flush/unbuffer)输出文件句柄(an output filehandle)?为什么我必需这么做?
虽然Perl支持"command buffering",在这种方式中,每次输出命令之后,物理写(a physical write)被执行,但是实际上,Perl并不支持真正的被清洗的输出(unbuffered output)(除了你"syswrite(OUT, $char, 1)")。
标准的C I/O库(stdio)是将字符送到设备进行缓冲(buffer),这样,对于每一种类型来说,并没有系统调用。在大多数stdio执行中,输出缓冲的类型及其大小都是依设备类型而定。Perl的print()和write()函数要对输出进行缓冲,而syswrite()对缓冲一起进行分流(bypass)。
如果你想让你的输出在你执行print()或者write()之后立即被传送(而不被缓冲),你必需设定句柄的autoflush 标记(flag)。这个标记是Perl变量 $|,当它被设为真(true)的时候,Perl在每次print()或者write()后,将清洗句柄缓冲。设定$|仅仅影响目前被选定的默认的文件句柄的缓冲。你可以用一个参数的select()调用来选择这个句柄。(参阅perlfunc manpage的perlvar/$和select条目(entry))
用select()来选择想要的句柄,然后设定per-filehandle变量。
$old_fh=select(OUTPUT_HANDLE);
$|=1;
select($old_fh);
某些习惯用语(idioms)能够一次完成以上操作:
select((select(OUTPUT_HANDLE), $|=1)[0]);
$1=1, select $_ for select OUTPUT_HANDLE;
一些模块能够对句柄及其变量提供面对对象的途径 (access),如果你仅仅想用他们来做这点事情,那简直是杀鸡用牛刀。你可以使用IO::Handle:
use IO::Handle;
open(DEV, ">/dev/printer"); #but is this?
DEV->autofulush(1);
或者 IO::Socket:
use IO::Socket; #this one is kinda a pipe?
my $sock=IO::Socket::INET->new('www.example.com:80');
$sock->autoflush();
|
|
|
----
It's better to burn out than to fade away...
|
|
[Original]
[Print]
[Top]
|
|
|