【问题标题】:Erlang printing hex instead of integerErlang 打印十六进制而不是整数
【发布时间】:2018-03-17 18:26:39
【问题描述】:

我已经尝试解决一个问题已经好几个小时了,对 erlang 很陌生

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

我希望它打印“100”而不是“d”

我在这里做错了什么?

【问题讨论】:

  • 这不是十六进制,而是 ASCII。
  • 上面的实际值不是ASCII“d”。你现在有一个反引号(char 值 96)...

标签: erlang erlang-shell


【解决方案1】:

只要合法,shell 就会尝试将字符串打印为字符串。这意味着恰好 all 为有效字符的整数列表将被打印为字符,而包含其他内容的列表将被打印为列表:

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 输出的便利性要有用得多。

【讨论】:

  • 我想可以添加一些关于函数shell:strings/1的信息。
  • @Atomic_alarm 感谢您的提醒。我添加了关于shell:strings/1 的注释。我想表达的主要内容是使用格式字符串的一般方法,因为它永远普遍有用,而 shell 便利值通常只是在玩一个想法时偶尔使用。
猜你喜欢
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多