perl6如何重新打开$ * IN输入?

时间:2016-12-26 10:11:48

标签: character controls stdin perl6

我一直在尝试从$ * IN中读取字符,包括控制字符。但是,在输入Control-D之后,似乎$ * IN变得不起作用。如何重新打开$ * IN进行阅读?

To exit type 'exit' or '^D'
> my $x=$*IN.getc             # entered "e"
e
e
> say ($x=$*IN.getc).ord      # entered Ctrl-D
10
> $x=$*IN.getc                # nothing can be entered now
(Any)
> my $y=$*IN.getc
(Any)
> 

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

当用户按下Ctrl-D时自动关闭stdin流,这不是Perl 6在流的接收端所做的事情 - 这是Unix终端驱动程序在结束时执行的操作流。因此,您将在其他所有编程语言中遇到相同的问题。

我不认为你可以要求终端在关闭stdin流后重新打开它。

但是,您可以指示终端暂时禁用其自动处理控制字符(如Ctrl + D(所谓的“Cooked mode”))的默认行为,而是使用“原始模式“其中EOT字符将按原样传递给您的程序。然后,您的程序可以决定如何解释该字符。

指示终端进入原始模式的一种方法是termios API,由Term::termios模块提供的Perl 6绑定。 (使用模块自述文件中演示的.makeraw方法。)