【问题标题】:Term::ReadLine - I need to hit the up arrow twice to retrieve historyTerm::ReadLine - 我需要按两次向上箭头来检索历史记录
【发布时间】:2012-10-31 05:43:59
【问题描述】:

我正在使用 Term::ReadLine 并且有一个奇怪的问题,我需要按两次向上箭头才能从 addhistory 中检索项目。这是我正在使用的脚本。

use Term::ReadLine;

my $term = Term::ReadLine->new('Term1');
print $term->ReadLine."\n";

while (defined(my $cmd = $term->readline())) {
    $term->addhistory($cmd) if $cmd =~ /\S/;
}

为了进行测试,我将输入一些“命令”,然后尝试使用向上箭头检索这些命令。我按了一次向上箭头,最后一个项目立即出现,但我需要按两次向上箭头才能检索到以下每个项目。

我早些时候在我正在进行的一个小项目中遇到了这个问题,并且遇到了同样问题的人。此问题的解决方法是对 addhistory 行进行如下修改:

$term->addhistory($cmd) if $cmd !~ /\S||\n/;

它起作用了,所以我继续前进,直到 Tanktalus 在我发布的另一个问题中提出这个问题。 Perl Term::ReadLine::Gnu Signal Handling Difficulties

他问“/\S||\n/ 应该做什么?”。好吧,让我去找那个建议修复的页面......是的......找不到它。因此,虽然我可以使它与我发布的修改一起工作,但我有点卡住了,因为 A。我不知道为什么它会修复它,B。为什么我似乎是唯一一个遇到这个问题的人?

任何帮助或建议将不胜感激! :)

用以下版本测试了上面的脚本:

Perl - 5.12.4 and 5.16.1
Term::ReadLine::Gnu - 1.20
Term::ReadLine::Perl - 1.0303 (Just tried it to make sure it wasn't Gnu)
Term::ReadLine - 1.10

【问题讨论】:

  • 你用的是什么终端,环境变量TERM设置成什么?

标签: perl readline


【解决方案1】:

/\S||\n/ 将始终匹配,因此您永远不会调用 addhistory。如果$term->Features->{autohistory} 为真,则无论如何都不需要。

“按两次向上箭头”是指每两个向上箭头向上移动一次历史记录吗?如果是这样,那么您对 ​​addhistory 的不必要调用就是罪魁祸首。完全删除呼叫是适当的解决方法。

【讨论】:

  • 非常感谢您为我指明正确的方向!情况就是这样,消除(第二次)对 addhistory 的调用解决了我的问题。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多