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

Tus*_*ani 0 erlang erlang-shell

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

lists:sublist([6,9,15,24,39,6,96],7,1).
Run Code Online (Sandbox Code Playgroud)

我希望这打印"100"而不是"d"

我在这里做错了什么?

zxq*_*xq9 5

只要合法​​,shell就会尝试将字符串打印为字符串.这意味着所有有效字符的整数列表将打印为字符,包含其他内容的列表将打印为列表:

1> [65,66,67].
"ABC"
2> [3,65,66,67].
[3,65,66,67]
Run Code Online (Sandbox Code Playgroud)

但请注意,我实际上并没有调用任何输出函数.这只是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
Run Code Online (Sandbox Code Playgroud)

请注意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
Run Code Online (Sandbox Code Playgroud)

附录

有一个调用的设置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">>
Run Code Online (Sandbox Code Playgroud)

但由于以下几个原因,我不再使用此设置了:

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