Term::ReadLine - Perl 对各种 readline
包的接口。如果找不到真正的包,则用存根代替基本函数。
use Term::ReadLine;
my $term = Term::ReadLine->new('Simple Perl calc');
my $prompt = "Enter your arithmetic expression: ";
my $OUT = $term->OUT || \*STDOUT;
while ( defined ($_ = $term->readline($prompt)) ) {
my $res = eval($_);
warn $@ if $@;
print $OUT $res, "\n" unless $@;
$term->addhistory($_) if /\S/;
}
此包只是其他一些包的前端。它是一个存根,用于为 CPAN 上找到的各种 ReadLine 实现(在 Term::ReadLine::*
命名空间下)设置一个通用接口。
所有支持的函数都应作为方法调用,即,要么作为
$term = Term::ReadLine->new('name');
要么作为
$term->addhistory('row');
其中 $term 是 Term::ReadLine->new() 的返回值。
ReadLine
返回执行命令的实际包。可能的取值包括 Term::ReadLine::Gnu
、Term::ReadLine::Perl
、Term::ReadLine::Stub
。
new
返回后续调用以下函数的句柄。参数是应用程序的名称。可选地,可以跟随两个参数用于 IN
和 OUT
文件句柄。这些参数应该是全局变量。
readline
获取输入行,可能带有实际的 readline
支持。尾随换行符将被删除。在 EOF
时返回 undef
。
addhistory
将该行添加到输入历史记录中,如果存在实际的 readline
,则可以从该历史记录中使用它。
IN
, OUT
返回输入和输出的文件句柄,或者如果 readline
输入和输出不能用于 Perl,则返回 undef
。
MinLine
如果指定了参数,则它是对要包含在历史记录中的行的最小大小的建议。undef
表示不将任何内容包含在历史记录中。返回旧值。
findConsole
返回一个包含两个字符串的数组,这两个字符串使用约定 "<$in"
、">out"
提供了用于输入和输出的文件的最合适名称。
返回的字符串可能不适用于 3 个参数的 open()。
返回一个对哈希的引用,该哈希描述了包的内部配置。此哈希中键的名称符合标准约定,开头省略了 rl_
。
Features
返回一个对哈希的引用,该哈希的键是当前实现中存在的特性。最小接口中使用了一些可选特性:如果 new
的第一个参数被识别,则 appname
应该存在,如果 MinLine
方法不是虚拟方法,则 minline
应该存在。如果行被自动放入历史记录中(可能受 MinLine
影响),则 autohistory
应该存在,如果 addhistory
方法不是虚拟方法,则 addhistory
应该存在。
如果 Features
方法报告存在 attribs
特性,则 Attribs
方法不是虚拟方法。
实际上,Term::ReadLine
可以使用其他一些包,这些包将支持更丰富的命令集。
所有这些命令都可以通过方法接口调用,并且具有符合标准约定的名称,开头为 rl_
被剥离。
perl 发行版中包含的存根包允许一些额外的 方法
tkRunning
在等待用户输入时(即在 readline
方法期间)使 Tk 事件循环运行。
event_loop
注册回调以等待用户输入(即在 readline
方法期间)。这取代了 tkRunning。
注册的第一个回调是等待的回调。预计回调将调用当前事件循环,直到有东西在输入文件句柄上等待。传入的参数是第二个回调的返回值。
注册的第二个回调是注册的回调。输入文件句柄(通常是 STDIN,但不一定是)将被传入。
例如,使用 AnyEvent
$term->event_loop(sub {
my $data = shift;
$data->[1] = AE::cv();
$data->[1]->recv();
}, sub {
my $fh = shift;
my $data = [];
$data->[0] = AE::io($fh, 0, sub { $data->[1]->send() });
$data;
});
如果在调用 $term->readline 之前注册了回调,则第二个回调是可选的。
在这种情况下,通过将 undef
作为参数调用 event_loop 来完成注销
$term->event_loop(undef);
这将导致数据数组引用被删除,允许正常的垃圾回收清理它。使用 AnyEvent,这将导致 $data->[0] 被清理,并且 AnyEvent 将在此时自动取消观察者。如果另一个循环需要更多内容来清理文件观察者,则由调用者负责处理。
ornaments
通过使用 termcap 数据使命令行脱颖而出。ornaments
的参数应为 0、1 或形式为 "aa,bb,cc,dd"
的字符串。此字符串的四个组件应该是终端能力的名称,前两个将被发出以使提示脱颖而出,后两个将使输入行脱颖而出。
newTTY
接受两个参数,分别是输入文件句柄和输出文件句柄。切换到使用这些文件句柄。
可以通过检查相应的 Features
来检查当前加载的 ReadLine 包是否支持这些方法。
无
环境变量 PERL_RL
控制加载哪个 ReadLine 克隆。如果值为 false,则使用虚拟接口。如果值为 true,则它应该是要使用的包名称的尾部,例如 Perl
或 Gnu
。
作为特殊情况,如果此变量的值是空格分隔的,则尾部可能用于通过将尾部设置为 o=0
或 ornaments=0
来禁用装饰。头部应如上所述,例如
如果变量未设置,或者空格分隔列表的开头为空,则会加载最佳可用包。
export "PERL_RL=Perl o=0" # Use Perl ReadLine sans ornaments
export "PERL_RL= o=0" # Use best available ReadLine sans ornaments
(请注意,PERL_RL
对装饰品的处理由所使用的特定 Term::ReadLine::*
包决定)。