在Erlang中从io:format中删除尾随确定

时间:2013-09-04 22:12:14

标签: erlang erlang-shell

我正在Erlang中构建一个简单的tic tac toe程序。我将电路板作为字符串传递给io:format("123\n456\n789\n"),并希望看到:

123
456
789

但是在Erlang shell中io:format("123\n456\n789\n")打印出来:

123
456
789
ok

有没有办法输出到控制台而没有尾随确定?

4 个答案:

答案 0 :(得分:6)

ok可以告诉您通话有效。函数io:format的规范指定了这一点。

这里真正的问题是你看到了erlang终端的混合,以及来自stdout的任何东西 - stdout正在打印数字,而erlang终端正在回馈ok

如果您使用escript编写脚本,那么ok策略将不会打印到标准输出 - 您应该只将控制台视为交互式解释器。

作为旁注,最简单的输出方式是:

123
456
789

将是

1> 123. 456. 789.
123
456
789

答案 1 :(得分:4)

它是shell,它打印最后ok个原子。试试这个:

erl -noshell -eval 'io:format("123\n456\n789\n"),init:stop()'

答案 2 :(得分:1)

Erlang shell是一个REPL,一个读取/评估/打印循环。它读取一个键入的表达式,对其进行求值,打印结果并循环以读取表达式。需要记住的重要一点是,您输入的表达式始终返回值,而shell 始终打印值。你不能不回报价值!

因此,当您输入io:format("123\n456\n789\n").时,shell会计算表达式并打印结果。评估对io:format的调用会导致打印出字符串,并且调用将返回shell打印出的值ok。因此你得到

123
456
789
ok

shell再次打印表达式返回的值。如果从另一个函数中调用io:format,则其返回值通常不会返回给shell,shell也不会将其打印出来。

请注意,返回值并打印某些内容是两件完全不同的事情。

答案 3 :(得分:-1)

这是一种解决方法(It's just for fun:)):

> spawn(fun() -> timer:sleep(1000), io:format("123\n456\n789\n") end).
<0.77.0>
123 
456
789