我可以在Erlang shell中禁用小整数的打印列表作为字符串吗?

时间:2010-02-27 16:41:52

标签: erlang erlang-shell

7 个答案:

答案 0 :(得分:20)

我不知道是否可以更改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()或类似的东西,可以很好地格式化所有内容。

答案 1 :(得分:8)

我倾向于通过将一个原子添加到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()]会在大部分时间打印“正确的东西(ish)”

答案 2 :(得分:7)

您可以使用shell:strings/1 function从Erlang R16B开始禁用此类行为。

请记住,这是所有节点shell的全局选项,在完成播放后将其设置为更长的生命节点中的shell可能是明智的。

答案 3 :(得分:5)

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]}

答案 4 :(得分:2)

不,没有办法禁用它。我发现的最佳替代方法是明确打印出查询中的值(使用io:format),或者在事实之后执行:io:format("~w\n", [v(-1)])

答案 5 :(得分:1)

我认为你不能阻止它。 预先填充一个原子看起来像一个kludge - 它确实会改变你的原始字符串。

我通常使用lists:flatten(String)来强制它为字符串 - 尤其是io_lib的returnvalue:format()并不总是打印成字符串。使用列表:flatten()就可以了。

我使用以下“C风格”:

sprintf(Format) ->
     sprintf(Format, []).
sprintf(Format, Args) ->
    lists:flatten(io_lib:format(Format, Args)).

答案 6 :(得分:0)

问题是字符串不是Erlang中的类型。字符串只是一个整数列表,因此shell无法区分可打印字符串和通用列表。不知道这个问题的答案是否正确。