Perl如何知道IO :: Select :: - > can_read中句柄中要读取的字节数?

时间:2017-08-27 07:48:40

标签: perl ipc

我正在使用IO::Select的{​​{1}}方法选择可以在简单的perl脚本中读取的文件句柄。

但是,文件句柄上的can_read运算符不需要传递长度。

<...>是否到达文件句柄内以设置“适当的长度”......或者到底发生了什么?

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"

然后由于一些奇怪的原因而异常退出......不确定退出状态的设置位置。

编辑:明显的异常退出似乎是tcsh中的错误。

1 个答案:

答案 0 :(得分:4)

IO :: Select都不知道长度,<...>运算符或readline函数都不知道它。相反,它只会尝试读取直到行尾的内容。如果找不到行尾字符(即$/),它将在非阻塞文件句柄的情况下返回所有可用数据,或者在阻塞文件句柄的情况下等到行尾或数据结束。 / p>

在您的特定情况下,echo a; sleep 5; echo b会在行a\n中生成一行b\n,并在行<..>中生成一行。由于您的代码在标量上下文中使用a\n,因此它只会读取一行。这意味着它将在找到第一行结束后停止并返回此行,从而生成 try (WebClient webClient = new WebClient()) { // page has an js error (same as with real browsers) // ignore these errors webClient.getOptions().setThrowExceptionOnScriptError(false); HtmlPage page = (HtmlPage) webClient.getPage("https://186.springfield.k12.il.us/IS3/"); // System.out.println(page.asXml()); // form has no name, we use the first one HtmlForm form = page.getForms().get(0); form.getInputByName("loginuseridvar").type("myusername"); // there seem to be some (async) magic that clears the password field // force this magic and wait until done otherwise the js will clear the password // after we typed it in and before the click will be processed form.getInputByName("password").focus(); webClient.waitForBackgroundJavaScript(100); form.getInputByName("password").type("mypassword"); page = form.getInputByName("login").click(); webClient.waitForBackgroundJavaScript(1000); System.out.println(page.asXml()); }