为什么io:get_line在erlang shell中返回“\ n”?

时间:2013-08-26 08:34:58

标签: erlang erlang-shell

在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读取一个值?

2 个答案:

答案 0 :(得分:2)

io:get_line / 1 io: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).

答案 1 :(得分: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,它也会达到其生命的终点。所以它在没有打印到shell的返回值(TheStringIEntered)时就会死掉。