我一直试图解决问题几个小时,对erlang来说是新手
lists:sublist([6,9,15,24,39,6,96],7,1).
我想要打印" 100"而不是" d"
我在这里做错了什么?
答案 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">>
但由于某些原因,我不再惹恼这个环境:
io
或io_lib
模块的实际输出函数,并且围绕格式字符串开发习惯比担心shell的便利输出更有用。