目錄

名稱

Term::ReadLine - Perl 介面到各種 readline 套件。如果找不到實際套件,則以 stub 取代基本函數。

語法

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/;
}

說明

這個套件只是一個其他套件的前端。它是一個 stub,用於設定 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 檔案控制代碼的兩個引數。這些引數應該是 glob。

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 發行版中包含的 stub 套件允許一些其他方法

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 之前註冊呼叫回函,則第二個呼叫回函是選用的。

在此情況下,會透過呼叫 event_loop,並將 undef 作為其參數,來取消註冊。

$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

(請注意,Term::ReadLine::* 套件的特定使用會自行決定如何處理裝飾用的 PERL_RL)。