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::Gnu
、Term::ReadLine::Perl
、Term::ReadLine::Stub
。
new
傳回後續呼叫下列函數的控制代碼。引數是應用程式的名稱。選擇性地,可以在後面加上 IN
和 OUT
檔案控制代碼的兩個引數。這些引數應該是 glob。
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 發行版中包含的 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 套件是否支援這些方法。
無
環境變數 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
(請注意,Term::ReadLine::*
套件的特定使用會自行決定如何處理裝飾用的 PERL_RL
)。