内容

名称

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::GnuTerm::ReadLine::PerlTerm::ReadLine::Stub

new

返回后续调用以下函数的句柄。参数是应用程序的名称。可选地,可以跟随两个参数用于 INOUT 文件句柄。这些参数应该是全局变量。

readline

获取输入行,可能带有实际的 readline 支持。尾随换行符将被删除。在 EOF 时返回 undef

addhistory

将该行添加到输入历史记录中,如果存在实际的 readline,则可以从该历史记录中使用它。

IN, OUT

返回输入和输出的文件句柄,或者如果 readline 输入和输出不能用于 Perl,则返回 undef

MinLine

如果指定了参数,则它是对要包含在历史记录中的行的最小大小的建议。undef 表示不将任何内容包含在历史记录中。返回旧值。

findConsole

返回一个包含两个字符串的数组,这两个字符串使用约定 "<$in"">out" 提供了用于输入和输出的文件的最合适名称。

返回的字符串可能不适用于 3 个参数的 open()。

Attribs

返回一个对哈希的引用,该哈希描述了包的内部配置。此哈希中键的名称符合标准约定,开头省略了 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 包是否支持这些方法。

EXPORTS

ENVIRONMENT

环境变量 PERL_RL 控制加载哪个 ReadLine 克隆。如果值为 false,则使用虚拟接口。如果值为 true,则它应该是要使用的包名称的尾部,例如 PerlGnu

作为特殊情况,如果此变量的值是空格分隔的,则尾部可能用于通过将尾部设置为 o=0ornaments=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::* 包决定)。