2013-02-03 102 views
3

我有下面的腳本,它與文檔中提要段落中的示例幾乎相同。如何使用Term :: ReadLine檢索命令歷史記錄?

use strict; 
use warnings; 
use Term::ReadLine; 

my $term = Term::ReadLine->new('My shell'); 
print $term, "\n"; 
my $prompt = "-> "; 

while (defined ($_ = $term->readline($prompt))) { 
    print $_, "\n"; 
    $term->addhistory($_); 
} 

它執行沒有錯誤,但不幸的是,即使我單擊向上箭頭,我只得到^[[A並沒有歷史。我錯過了什麼?

print $term聲明打印Term::ReadLine::Stub=ARRAY(0x223d2b8)

由於我們在這裏,我注意到它打印提示下劃線...但我無法在文檔中找到任何可以阻止它的東西。有什麼辦法可以避免它?

+0

它爲我(在Debian的Perl 5.10)。你有沒有檢查你的終端鍵盤綁定? – Rob

+1

@Rob,你使用哪一個Term :: ReadLine實現?它在我安裝了Term :: ReadLine :: Gnu後爲我工作,但我認爲它應該已經工作,即使與存根... – Zagorax

回答

5

要回答主要問題,您可能沒有安裝好的Term :: ReadLine庫。你會想'perl-Term-ReadLine-Perl'或'perl-Term-ReadLine-Gnu'。這些是Fedora軟件包的名稱,但我確定ubuntu/debian的名稱是相似的。我相信你也可以從CPAN獲得他們,但我沒有測試過。如果你還沒有安裝這個軟件包,perl會加載一個幾乎沒有功能的虛擬模塊。因爲這個原因,歷史不是它的一部分。

下劃線是readline調用飾品的一部分。如果您想徹底關閉它們,請在適當的地方添加$term->ornaments(0);

我的腳本的重寫是如下

#!/usr/bin/perl 
use strict; 
use warnings; 

use Term::ReadLine; # make sure you have the gnu or perl implementation of readline isntalled 
# eg: Term::ReadLine::Gnu or Term::ReadLine::Perl 
my $term = Term::ReadLine->new('My shell'); 
my $prompt = "-> "; 
$term->ornaments(0); # disable ornaments. 

while (defined ($_ = $term->readline($prompt))) { 
    print $_, "\n"; 
    $term->addhistory($_); 
} 
+0

@Zagorax你會介意選擇一個答案或提交自己的? – Mobius

+0

注意:飾品(0)不適合我。在BEGIN {}塊中設置$ ENV {PERL_RL} =「o = 0」。說來也怪 –

相關問題