我能否在 Erlang shell 中禁用将小整数列表打印为字符串的形式?

7个回答

23

我不知道是否可以更改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,并且在问题中可能应该提到它 :) - Alexey Romanov
这正是我需要将整数列表打印为字符串时寻找的东西。谢谢! - matthew.

9
我通常在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)”


9

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

请记住,这是适用于所有节点 shell 的全局选项,对于生存时间更长的节点,在完成播放后将其设置回来可能是明智的选择。


7

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

2

不,没有办法禁用它。我找到的最佳替代方法是要么在查询中显式打印值(使用io:format),要么事后执行:io:format("~w\n", [v(-1)])


1

我认为你无法防止它。 在字符串前添加原子似乎是一个笨拙的方法 - 它会改变你的原始字符串。

我通常使用lists:flatten(String)将其强制转换为字符串 - 特别是io_lib:format()的返回值并不总是打印为字符串。对其使用lists:flatten()可以使其成为字符串。

我使用以下"C风格":

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

0
问题在于字符串在 Erlang 中不是一种类型。字符串只是整数列表,因此 shell 无法区分可打印字符串和通用列表。不知道这是否回答了你的问题。

@Zed:我注意到了。但是我想我误解了问题。现在我明白他想做什么了。谢谢。 - Roberto Aloi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接