我可以在 Erlang shell 中禁用将小整数列表打印为字符串吗?
-
23-09-2019 - |
题
Erlang shell“猜测”给定列表是否是可打印字符串,并以这种方式打印以方便起见。 这种“便利”能被禁用吗?
解决方案
可以与 shell:strings/1
功能使用Erlang R16B开始禁用这样的行为。
请记住,这是全球性的选择对所有节点壳,它可能是明智的,设置回整理后打是壳牌在不在人世节点。
其他提示
我不知道是否可以更改 shell 的默认行为,但您至少可以使用正确格式化输出 io:格式.
这是一个例子:
1> io:format("~p~n", [[65, 66, 67]]).
"ABC"
ok
2> io:format("~w~n", [[65, 66, 67]]).
[65,66,67]
ok
并且由于外壳仅用于实验/维护, 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/OTP R16B 开始, ,您可以使用该功能 外壳:字符串/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)])
我不认为你可以阻止它。 前面加上一个原子似乎是一个组装机 - 它不改变原来的字符串
我通常使用列表:弄平(字符串)迫使它为一个字符串 - 尤其io_lib的返回值:格式()不总是打印为字符串。使用列表:弄平()上它使得一个
。我使用下面的 “C风格”:
sprintf(Format) ->
sprintf(Format, []).
sprintf(Format, Args) ->
lists:flatten(io_lib:format(Format, Args)).
的问题是,该字符串不是Erlang中一个类型。字符串就是一个整数列表,所以没有办法为外壳,以打印字符串从一个普通的列表区分。不知道这样的回答你的问题。