Erlang shell会猜测给定的列表是否是可打印字符串,并为了方便而以这种方式打印它。 这种“方便”可以禁用吗?
我不知道是否可以更改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()
或类似的方法,可以很好地格式化输出。
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)”
您可以使用Erlang R16B开始的shell:strings/1
函数禁用此类行为。
请记住,这是适用于所有节点 shell 的全局选项,对于生存时间更长的节点,在完成播放后将其设置回来可能是明智的选择。
从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]}
不,没有办法禁用它。我找到的最佳替代方法是要么在查询中显式打印值(使用io:format
),要么事后执行:io:format("~w\n", [v(-1)])
。
我认为你无法防止它。 在字符串前添加原子似乎是一个笨拙的方法 - 它会改变你的原始字符串。
我通常使用lists:flatten(String)将其强制转换为字符串 - 特别是io_lib:format()的返回值并不总是打印为字符串。对其使用lists:flatten()可以使其成为字符串。
我使用以下"C风格":
sprintf(Format) ->
sprintf(Format, []).
sprintf(Format, Args) ->
lists:flatten(io_lib:format(Format, Args)).