最后一个 seek 在不移动指针的情况下清理文件结束错误。因你的 C 库的标准 I/O 实现的标准程度的不同而异,你可能需要一些更象下面这样的东西:
for (;;) {
for ($curpos = tell FILE; ; $curpos = tell FILE) {
grok($_); # 处理当前行
}
sleep $for_a_while;
seek FILE, $curpos, 0; # 重置 end-of-file 错误。
}
类似的策略可以用于在一个数组里记住 seek 每一行的地址。
seekdir DIRHANDLE, POS
select FILEHANDLE
select
由于历史原因,Perl 里有完全互不相关的两个 select 操作符。参阅下一节获取另外一个的描述。这个版本的 select 操作符返回当前选定的输出操作符,并且,如果你提供了 FILEHANDLE,那么把它设置为当前缺省输出操作符。这样做有两个效果:首先,一个没有文件句柄的 write 或者 print 将缺省输出到这个 FILEHANDLE。其次,与输出相关的特殊变量将指向这个文件句柄。比如,如果你想为多个输出文件句柄设置了相同的页顶格式,那么你可能需要做这些:
select REPORT1; $^ = 'MyTop'; select REPROT2; $^ = 'MyTop';
但请注意这样就把 REPORT2 当作当前选定的文件句柄了。这种做法可以说是的做法,因为它可能会真的把一些其他过程的 print 或者 write 语句搞坏。写的好的库过程会在退出的时候把当前选定文件句柄设置为和进入过程时相同的那个。为了支持这个,FILEHANLDE 可以是一个表达式,该表达式的值给出实际文件句柄的名字。因此,你可以用下面的代码保存并恢复当前选顶的文件句柄:
my $oldfh = select STDER; $| = 1; select $oldfh;
或者使用惯用的但有点模糊的方法:
select((select(STDERR), $| = 1)[0])
这个例子是这样运转的:制作一个由 select(STDERR) (副作用是选定了 STDERR)的返回值和 $|=1 (它总是 1)组成的列表,但同时,又作为副作用设置了现在选定的 STDERR 的自动冲刷。该列表的第一个元素(前面那个选定的文件句柄)现在用做外层 select 的一个参数。古怪吧?这些足够让你知道 List 比较危险了。
你还可以使用标准的 SelectSaver? 模块在退出范围的时候自动恢复前面一个 select。
不过,虽然我们给你解释了上面的全部东西,我们还是可以指出在当今的情况下,你很少需要使用这种形式的 select,因为你象设置的大多数特殊变量都有面向对象的封装方法帮你做这些事情。所以,你不用直接设置 $|,而是:
use IO::Handle; # 糟糕的是,这可不是个*小*模块。 STDOUT->autoflush(1);
而前面的格式化例子可以这样编码:
use IO::Handle;
REPORT1->format_top_name("MyTop");
REPORT2->format_top_name("MyTop");
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-28372-2.html
”“逢中必反
伟大领袖毛主席教导我们说