Input perl6是否有方法进行可编辑提示输入?

Input perl6是否有方法进行可编辑提示输入?,input,default,prompt,raku,Input,Default,Prompt,Raku,在bashshell中,如果单击向上或向下箭头,shell将显示您输入的上一个或下一个命令,并且您可以将这些命令编辑为新的shell命令 如果你愿意的话 my $name = prompt("Enter name: "); 它将打印“输入名称:”然后请求输入;有没有办法让perl6给您一个默认值,然后您只需将默认值编辑为新值。例如: my $name = prompt("Your name:", "John Doe"); 它会打印出来 Your name: John Doe 其中John

在bashshell中,如果单击向上或向下箭头,shell将显示您输入的上一个或下一个命令,并且您可以将这些命令编辑为新的shell命令

如果你愿意的话

my $name = prompt("Enter name: ");
它将打印“输入名称:”然后请求输入;有没有办法让perl6给您一个默认值,然后您只需将默认值编辑为新值。例如:

my $name = prompt("Your name:", "John Doe");
它会打印出来

Your name: John Doe
其中John Doe零件是可编辑的,当您点击enter键时,编辑的字符串是$name的值

没有说明如何做

如果您必须输入许多长字符串,而每个字符串只是与其他字符串不同的几个字符,则此选项非常有用


谢谢。

要启动编辑部分,您可以使用Linenoise模块:

zef install Linenoise
()

然后,在代码中执行以下操作:

use Linenoise;
sub prompt($p) {
    my $l = linenoise $p;
    linenoiseHistoryAdd($l);
    $l
}
然后,您可以使用提示符执行循环。请记住,基本上所有Perl6内置函数都可以在词汇上重写。现在,如何填充原始字符串,我还没有弄清楚。也许libreadline文档可以帮助您解决这个问题。

另一个解决方案:

使用 使用该选项,您可以设置默认值甚至默认类型:

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建议的方法。

默认情况下,程序完全不知道它们的终端。
您需要您的程序与终端进行通信,以便执行诸如预填充输入行之类的操作,而期望Perl 6将此类操作作为核心语言的一部分来处理是不合理的

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

不幸的是,Perl6ReadLine似乎没有预输入挂钩设置,因此您需要自己处理回调和读取循环。以下是我的粗略尝试,完全符合您的要求:

使用v6;
使用Readline;
子提示预填充($问题,$建议){
my$rl=Readline.new;
我的回答;
我的子行处理程序(Str$line){
rl_callback_handler_remove();
$answer=$line;
}
rl_回调_处理程序_安装($QUEST,&行处理程序);
$rl.插入文本($suggestion);
$rl.0重新显示;
while(!$answer){
$rl.callback-read-char();
}
返回$answer;
}
my$name=提示前缀(“你叫什么名字?”,“Bob”);
说“嗨,$name,走开。”;


如果您仍在使用,您可能会发现“提示”功能足以满足您的需要(如果您需要演示,
rediscli
应用程序会广泛使用它)。请参阅中与
lineNoiseThintScallBack一起使用的
提示
回调。如果这还不够好,你就必须开始挖掘线路噪音的根源。

非常感谢你,伊丽莎白·马蒂森!!!我会检查linenoise。谢谢你,Timbus!我会查看Readline和您的代码!!没问题。但我应该提到,我今天无法在我的机器上安装Readline。结果是最近的一次更改破坏了安装,但在修复之前还有一个解决方法:谢谢Wolf和LuFFy,我将检查IO::Prompt!!