2017-10-06 47 views
0

我一直在努力,现在修复了几个小时的问题,很新二郎神二郎打印十六进制,而不是整数

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

我想这个打印“100”,而不是“d”

什么我在这里做错了吗?

+0

这不是十六进制,它是ASCII。 – tadman

+0

上面的实际值不是ASCII“d”。你现在有一个反向(char值为96)... – zxq9

回答

6

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输出。
  • 这几乎从来都不是你想要的行为。
  • 当处理真正的程序时,您将需要使用ioio_lib模块的实际输出功能,围绕格式化字符串开发习惯比从外壳方便输出更令人担忧。
+1

我想可以添加一些关于函数'shell:strings/1'的信息。 –

+0

@Atomic_alarm感谢您的提醒。我添加了关于'shell:strings/1'的注释。我想要表达的主要是使用格式化字符串的一般方法,因为它永远是普遍有用的,而shell的便利值通常只是偶尔在玩这个想法时偶尔使用。 – zxq9