答案 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无法区分可打印字符串和通用列表。不知道这个问题的答案是否正确。