我可以在 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 中禁用将小整数打印为字符串的列表吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Erlang shell 中运行 Erlang 应用程序

Erlang Shell

让 Erlang shell 忘记 BIF

Erlang shell在使用路径添加时忽略参数

无法从 shell 生成 erlang 主管

使用 unix 批处理自动化 Erlang shell 节点