perl6有没有办法做可编辑的提示输入?

时间:2017-03-26 18:26:22

标签: input default prompt perl6

在bash shell中,如果你向上或向下箭头,shell会显示你输入的上一个或下一个命令,你可以编辑这些命令作为新的shell命令。

在perl6中,如果你这样做

my $name = prompt("Enter name: ");

它将打印“输入名称:”,然后要求输入;有没有办法让perl6给你一个默认值,然后你只需将默认值编辑为新值。 E.g:

my $name = prompt("Your name:", "John Doe");

并打印

Your name: John Doe

其中John Doe部分是可编辑的,当您按Enter键时,编辑的字符串是$ name的值。

https://docs.perl6.org/routine/prompt未显示如何操作。

如果您必须输入许多长字符串,这很有用,每个长字符串只是与其他字符串不同的几个字符。

感谢。

3 个答案:

答案 0 :(得分:4)

要使编辑部分运行,您可以使用Linenoise模块:

zef install Linenoise

https://github.com/hoelzro/p6-linenoise

然后,在您的代码中,执行:

use Linenoise;
sub prompt($p) {
    my $l = linenoise $p;
    linenoiseHistoryAdd($l);
    $l
}

然后你可以用提示做你的循环。请记住,基本上所有Perl 6内置函数都可以在词法上被覆盖。现在,如何填写原始字符串,我还没有弄明白。也许libreadline文档可以帮助你。

答案 1 :(得分:2)

默认情况下,程序完全不知道他们的终端 你需要你的程序与终端进行通信以完成预填充输入行之类的事情,并且期望Perl 6像处理核心语言一样处理这样的事情是不合理的。

也就是说,只要您有兼容的终端,您的确切案例就会由Readline库处理。

看起来perl 6 Readline没有设置预输入挂钩,所以你需要自己处理回调和读取循环。这是我的粗略尝试,完全符合您的要求:

use v6;
use Readline;

sub prompt-prefill($question, $suggestion) {
  my $rl = Readline.new;
  my $answer;
  my sub line-handler( Str $line ) {
    rl_callback_handler_remove();
    $answer = $line;
  }

  rl_callback_handler_install( "$question ", &line-handler );

  $rl.insert-text($suggestion);
  $rl.redisplay;
  while (!$answer) {
    $rl.callback-read-char();
  }

  return $answer;
}


my $name = prompt-prefill("What's your name?", "Bob");
say "Hi $name. Go away.";

如果您仍然使用Linenoise,您可能会发现“提示”功能足以满足您的需求(如果您需要演示,redis-cli应用程序会广泛使用它。查看the linenoise example.c filehint使用的linenoiseSetHintsCallback回调。如果这还不够好,你将不得不开始深入挖掘linenoise的内涵。

答案 2 :(得分:1)

另一种解决方案:

使用io-prompt 有了它,您可以设置默认值,甚至是默认类型:

my $a = ask( "Life, the universe and everything?", 42, type => Num );
Life, the universe and everything? [42]
Int $a = 42

您可以使用以下方式安装:

zef install IO::Prompt

但是,如果只是默认值是不够的。那么你最好使用Liz建议的方法。