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

perl6 How to re-open $*IN for input?

我一直在尝试从 $*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)
> 

感谢您的帮助。

当用户按下 Ctrl-D 时自动关闭标准输入流,这不是 Perl 6 在流的接收端做的事情——这是 Unix 终端驱动程序在 its[=23 上做的事情=] 流结束。因此,您在所有其他编程语言中都会遇到同样的问题。

我认为您不能要求终端在关闭标准输入流后重新打开它。

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

指示终端进入原始模式的一种方法是 termios API, the Perl 6 bindings for which are provided by the Term::termios 模块。 (使用模块自述文件中演示的 .makeraw 方法。)