0

在 erlang shell 中使用 io:getline("prompt") 时,函数立即返回,返回值为 "\n"

io:get_line("prompt"). 
prompt
"\n"

但正如另一个线程中所建议的那样,正确地从 standard_io 读取以下内容。

spawn(fun() -> timer:sleep(100),io:get_line("prompt") end). 

等待用户输入并从标准 io (shell) 读取。有人提到这是一个竞争条件。谁能告诉我为什么会这样以及如何从 erlang shell 中读取值?

4

2 回答 2

2

io:get_line/1io:get_line/2每次都返回带有\n的数据。

get_line(Prompt) -> Data | server_no_data()

在哪里:

数据

行中的字符以 LF(或文件结尾)结尾。如果 IO 设备支持 Unicode,则数据可能表示大于 255(latin1 范围)的代码点。如果 I/O 服务器设置为传递二进制文件,它们将以 UTF-8 编码(无论 IO 设备是否实际支持 Unicode)。

在第一种情况下,您得到了\n,并尝试io:get_line在第二种情况下获得结果:

spawn(fun() -> 
      timer:sleep(100), 
      Result = io:get_line("prompt"), 
      io:format("Result: ~p~n", [Result]) 
end).
于 2013-08-26T08:55:18.220 回答
0

让我们分解一下...

为什么io:get_line/1返回一个\n

io:get_line/1返回一个“行”和一个\n(“行尾”或“新行”)与您输入的字符串一起构成一行。

> io:get_line("Prompt:").
Prompt:TheStringIEntered
"TheStringIEntered\n"

如何从 Erlang shell 中读取一个值?

> Data = string:strip(io:get_line("Prompt:"), right, $\n).
Prompt:TheStringIEntered
"TheStringIEntered"
> Data.
"TheStringIEntered"

注意这里的值(Data)总是字符串类型的。您可以将其转换为其他类型,但始终以字符串开头。

为什么spawn(fun() -> timer:sleep(100),io:get_line("prompt") end).行为不同?

因为spawn产生了一个临时接管 shell 的新进程。一旦这个过程得到TheStringIEntered,它也到达了它的生命的尽头。因此它在没有将其返回值 ( TheStringIEntered) 打印到 shell 的情况下死亡。

于 2013-09-02T12:31:09.747 回答