代码之家  ›  专栏  ›  技术社区  ›  lisprogtor

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

  •  4
  • lisprogtor  · 技术社区  · 8 年前

    我一直在尝试读取$*中的字符,包括控制字符。然而,在输入Control-D后,似乎$*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 回复  |  直到 8 年前
        1
  •  4
  •   smls    8 年前

    当用户按下Ctrl-D时自动关闭stdin流不是Perl 6在流的接收端所做的事情,而是Unix终端驱动程序所做的 它的 流的尽头。因此,在所有其他编程语言中都会遇到同样的问题。

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

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

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