我可以在 Erlang shell 中禁用将小整数打印为字符串的列表吗?
Posted
技术标签:
【中文标题】我可以在 Erlang shell 中禁用将小整数打印为字符串的列表吗?【英文标题】:Can I disable printing lists of small integers as strings in Erlang shell? 【发布时间】:2011-01-21 19:54:12 【问题描述】:The Erlang shell "guesses" whether a given list is a printable string and prints it that way for convenience.这个“便利”可以禁用吗?
【问题讨论】:
【参考方案1】:我不知道是否可以更改 shell 的默认行为,但您至少可以使用 io:format 正确格式化输出。
这是一个例子:
1> io:format("~p~n", [[65, 66, 67]]).
"ABC"
ok
2> io:format("~w~n", [[65, 66, 67]]).
[65,66,67]
ok
由于 shell 仅用于试验/维护,io:format()
至少对于您的实际应用程序来说已经足够了。也许您还应该考虑编写自己的格式/打印方法,例如formatPerson()
或类似的东西,可以很好地格式化所有内容。
【讨论】:
我确实知道 io:format 并且可能应该在问题中提到它:) 当我需要将整数列表打印为字符串时,这正是我所寻找的。谢谢!【参考方案2】:问题是字符串不是 Erlang 中的类型。字符串只是整数列表,因此 shell 无法区分可打印字符串和通用列表。不知道这是否回答了你的问题。
【讨论】:
@Zed:我知道这一点。但我想我误解了这个问题。现在我得到了他想要做的事情。谢谢。【参考方案3】:我倾向于通过在我的 shell 列表中添加一个原子来做到这一点。
例如:
Eshell V5.7.4 (abort with ^G)
1> [65,66,67].
"ABC"
2> [a|[65,66,67]].
[a,65,66,67]
当然也可以是 [a,65,66,67]。但是 [a|fun_that_returns_a_list()] 会打印“大部分时间是正确的”
【讨论】:
【参考方案4】:不,没有办法禁用它。我发现最好的替代方法是显式打印出查询中的值(使用io:format
)或事后执行:io:format("~w\n", [v(-1)])
。
【讨论】:
【参考方案5】:我认为你无法阻止它。 预先添加一个原子似乎是一个杂物——它确实会改变你原来的字符串。
我通常使用 lists:flatten(String) 将其强制为字符串 - 特别是 io_lib:format() 的返回值并不总是打印为字符串。在其上使用 lists:flatten() 使其成为一个。
我使用以下“C-style”:
sprintf(Format) ->
sprintf(Format, []).
sprintf(Format, Args) ->
lists:flatten(io_lib:format(Format, Args)).
【讨论】:
【参考方案6】:As of Erlang/OTP R16B,您可以使用shell:strings/1 功能来开启或关闭此功能。请注意,它还会影响实际为字符串的内容的打印,例如以下示例中的"foo"
:
1> [8,9,10], "foo".
"\b\t\n","foo"
2> shell:strings(false).
true
3> [8,9,10], "foo".
[8,9,10],[102,111,111]
【讨论】:
【参考方案7】:您可以使用从 Erlang R16B 开始的 shell:strings/1
function 禁用此类行为。
请记住,这是所有节点 shell 的全局选项,在完成播放后将其设置回来可能是明智的做法是更长寿命节点中的 shell。
【讨论】:
以上是关于我可以在 Erlang shell 中禁用将小整数打印为字符串的列表吗?的主要内容,如果未能解决你的问题,请参考以下文章