在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未显示如何操作。
如果您必须输入许多长字符串,这很有用,每个长字符串只是与其他字符串不同的几个字符。
感谢。
答案 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 file中hint
使用的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建议的方法。