我一直在尝试从$ * 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)
>
感谢您的帮助。
答案 0 :(得分:4)
当用户按下Ctrl-D时自动关闭stdin流,这不是Perl 6在流的接收端所做的事情 - 这是Unix终端驱动程序在其结束时执行的操作流。因此,您将在其他所有编程语言中遇到相同的问题。
我不认为你可以要求终端在关闭stdin流后重新打开它。
但是,您可以指示终端暂时禁用其自动处理控制字符(如Ctrl + D(所谓的“Cooked mode”))的默认行为,而是使用“原始模式“其中EOT字符将按原样传递给您的程序。然后,您的程序可以决定如何解释该字符。
指示终端进入原始模式的一种方法是termios API,由Term::termios模块提供的Perl 6绑定。 (使用模块自述文件中演示的.makeraw
方法。)