如何使用Term :: ReadLine来检索命令历史记录?

时间:2013-02-03 11:06:56

标签: perl readline arrow-keys

我有以下脚本,几乎与文档中的概要段落中的示例相同。

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)

因为我们在这里,所以我注意到它打印了带下划线的提示...但我在文档中找不到任何可能阻止它的东西。有什么方法可以避免吗?

1 个答案:

答案 0 :(得分: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($_);
}