Erlang打印十六进制而不是整数

时间:2017-10-06 02:31:19

标签: erlang erlang-shell

我一直试图解决问题几个小时,对erlang来说是新手

lists:sublist([6,9,15,24,39,6,96],7,1).

我想要打印" 100"而不是" d"

我在这里做错了什么?

1 个答案:

答案 0 :(得分:5)

shell将尝试在合法的情况下将字符串作为字符串打印。这意味着碰巧所有有效字符的整数列表将打印为字符,包含其他内容的列表将打印为列表:

1> [65,66,67].
"ABC"
2> [3,65,66,67].
[3,65,66,67]

但是注意到我实际上没有调用任何输出函数。这只是shell的方便操作,隐式回显任何返回值,所以作为程序员,你可以检查它。

如果我想显式调用输出函数,我应该使用一个格式字符串来指定要插值的值的性质:

3> io:format("This is a list: ~tw~n", [List]).
This is a list: [65,66,67]
ok
4> io:format("This is a list rendered as an implied string: ~tp~n", [List]).
This is a list rendered as an implied string: "ABC"
ok
5> io:format("This is a string: ~ts~n", [List]).                            
This is a string: ABC
ok

请注意每次打印后的附加原子ok。这是因为io:format/2的返回值为ok。因此,我们从format/2获取显式输出,然后查看其返回值。

io模块文档页面包含细节:http://erlang.org/doc/man/io.html#format-1

回到你的例子......

6> lists:sublist([6,9,15,24,39,6,96],7,1).
"`"
7> io:format("~tw~n", [lists:sublist([6,9,15,24,39,6,96],7,1)]).
[96]
ok

<强>附录

有一个名为shell:strings/1的设置告诉shell打开和关闭字符串格式:

1> [65,66,67].
"ABC"
2> shell:strings(false).
true
3> [65,66,67].
[65,66,67]
4> <<65,66,67>>.
<<65,66,67>>
5> shell:strings(true). 
false
6> <<65,66,67>>.       
<<"ABC">>

但由于某些原因,我不再惹恼这个环境:

  • 记住shell的这个细节几乎永远不值得(shell的便利输出对于发现返回值结构,而不是特定值非常有用通过这些结构 - 当你想要那些数据时,你通常希望字符串打印为字符串。
  • 在您真正 处理字符串的任何情况下,它都会导致令人惊讶的shell输出。
  • 这几乎不是你真正想要的行为。
  • 在处理实际程序时,您将需要使用ioio_lib模块的实际输出函数,并且围绕格式字符串开发习惯比担心shell的便利输出更有用。