我正在使用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中的错误。
答案 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());
}
。