【问题标题】:Read a character input from Erlang without requiring the Return key pressed from the prompt从 Erlang 读取字符输入,无需在提示符下按下 Return 键
【发布时间】:2017-08-02 16:38:32
【问题描述】:

我正在查看io 模块http://erlang.org/doc/man/io.html#read-1

并发现读取输入使用 Prompt 并等待用户按 Enter(返回?)。

如何在不需要回车的情况下一次读取 1 个字符?

编辑

我试过了

io:setopts([{binary, true}]) 但这不会改变它。

【问题讨论】:

  • 感谢@SteveVinoski,它很接近,但这个问题在 Elixir 中,他们接受的答案也是如此。给出的 erlang curses 答案在他们的自述文件中没有清楚地表明如何逐行接受输入,而是显示一个弹跳的“Hello World”,所以我相信这不是重复的,不应该被关闭。

标签: io erlang stdin


【解决方案1】:

把自己绑在量子土豆上,你即将进入一个你从未知道存在的痛苦世界。


一个负责任的程序员会告诉你,没有办法做到这一点,当然不是便携式的。

现在,“不便携”这个短语已经被像 CHAR_BIT != 8 这样的迂腐狂热的梦想所淡化,以巧妙地说服每个人“不便携”意味着 “构建了一些 LSD 上瘾的系统在 60 年代后期无法运行这个”“不会在 Windows 上运行”

不,您将要遇到的是导致我们的祖先自愿使用自动工具的可移植性问题。真的,真的,可移植到不同的系统,甚至是 POSIX“兼容”系统。

正如您可能想象的那样,做到这一点的明智方法是依赖 Ncurses 之类的东西,但正如许多生活必需品一样,Erlang 不存在非 NIF 实现。

尽管我刚刚给了你所有这些警告,这就是我过去在紧要关头所做的事情:

-module(thing).
-compile(export_all).

get_char() ->
    Ch = io:get_chars("p: ", 1),
    io:fwrite("Ch: ~w", [Ch]).

start() ->
    io:setopts([{binary, true}]),
    get_char().

独自一人,这当然行不通。因此,您需要从另一个设置适当的 termios 输入标志的脚本调用您的脚本。正如我之前提到的,这在过去是一个真正的废话,我还没有听到任何让我相信情况已经改变的消息。

#!/bin/sh
stty --f /dev/tty icanon raw
erl -pa ./ -run thing start -run init stop -noshell
stty echo echok icanon -raw

也可以在 Erlang 程序中调用“stty”或发送魔法字符,但如果没有记忆,您需要使用-noshell 调用erl 并添加额外的@987654329 @像timeecho 0这样的咒语。

我过去遇到的另一个问题是,虽然您可以安全地使用 get_chars,但其他 io 函数会失败,因为其中一些函数有自己的内置“在线烹饪”。

如果这一切还没有让你相信计算机对人类来说是一场灾难,你可以在优秀的书籍The Linux Programming Interface 中阅读更多关于这方面的细节。

祝你好运。

【讨论】:

  • 这确实有效,谢谢。作为一种解决方法,我编写了一个可以设置stty raw(erl shell 不能)调用erlang 文件的c 程序。遇到 tcp 套接字一致性从另一个 erlang 进程加载数据的问题,如果你敢看stackoverflow.com/questions/42755951/…
  • 顺便说一句,您的答案正常,但使用 stop 需要很长时间才能关闭。使用halt而不是stop向用户显示错误消息,不知道有没有解决办法?
  • 我的目标是在 erlang 环境中逐个字符地阅读。我认为我的另一个 Q ^ 是在正确的道路上,通过运行一个单独的 erlang 服务器并 ping 它
  • 啊哈。我只是从调用中删除了停止,创建了 get_char() 循环,这很好用!
  • 相关 -- 如何在不显示故障转储的情况下退出 stackoverflow.com/questions/42792422/…
猜你喜欢
  • 2013-12-15
  • 2013-12-13
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多