我有一个这样的列表:
列表= [<<“ Lucky Labon:嗨” >>,<<“ Lucky Labon:保持?” >>, <<“ Lucky Labon:高山是...” >>]
我试图将所有项目合并在一起,但换行。
我的尝试是这样的:
lists:foldl(fun(X,A2) -> lists:append(A2, binary_to_list(X)) end, [], List).
结果是:
"Lucky Labon: HeyLucky Labon: Keep?Lucky Labon: Alpine is..."
几乎是我想要的,每个字符串之后都需要换一行
"Lucky Labon: Hey
Lucky Labon: Keep?
Lucky Labon: Alpine is..."
答案 0 :(得分:5)
如果只需要打印结果,请使用iolist的概念:
iolist()= may_improper_list(byte()| binary()| iolist(),binary() | [])
然后您可以像这样轻松地转换列表:
1> ListOfSentences = [<<"Lucky Labon: Hey">>,<<"Lucky Labon: Keep?">>, <<"Lucky Labon: Alpine is...">>],
1> PrintableList = [[X,"\n"] || X <- ListOfSentences],
1> io:format("~s",[PrintableList]).
Lucky Labon: Hey
Lucky Labon: Keep?
Lucky Labon: Alpine is...
ok
2>
这样做可以避免不必要的中间列表副本。
答案 1 :(得分:3)
Erlang中有一个叫做iolist
的东西。这是切成薄片的面包后发明的最伟大的东西之一。 (我个人认为切成薄片的面包根本不是什么好东西,但是它是常用的词组,因此我会保留它。)这是一种格式,它使您可以非常高效地执行许多操作。例如,如果您只想在List
中的每个二进制文件后添加换行符即可。
> List = [<<"Lucky Labon: Hey">>,<<"Lucky Labon: Keep?">>, <<"Lucky Labon: Alpine is...">>].
[<<"Lucky Labon: Hey">>,<<"Lucky Labon: Keep?">>,
<<"Lucky Labon: Alpine is...">>]
> S = [[X,$\n] || X <- List].
[[<<"Lucky Labon: Hey">>,10],
[<<"Lucky Labon: Keep?">>,10],
[<<"Lucky Labon: Alpine is...">>,10]]
基本上是O(N)运算,其中N是列表中的多个二进制数。没有比这更有效的了。不涉及原始二进制文件的任何数据复制。开销非常小,并且所有与IO操作一起使用的标准库都支持iolist的处理。您总是可以将iolist更改为二进制文件或使用它执行IO操作。
> iolist_to_binary(S).
<<"Lucky Labon: Hey\nLucky Labon: Keep?\nLucky Labon: Alpine is...\n">>
> io:put_chars(S).
Lucky Labon: Hey
Lucky Labon: Keep?
Lucky Labon: Alpine is...
ok
IO操作或转换为iolist的二进制代码是O(N)操作,其中N是输出的大小。没有比这更有效的了。 (IO子系统甚至可以使用writev()系统调用,这完全避免了任何用户空间缓冲区的复制,并使IO更加高效。)一个简单的经验法则是,只要您没有很好的理由,就使用iolist。
答案 2 :(得分:-3)
1> io:format("~s", [lists:foldl(fun(X,A2) -> lists:append(A2,
binary_to_list(X) ++ "\n") end, [], List)]).
Lucky Labon: Hey
Lucky Labon: Keep?
Lucky Labon: Alpine is...
ok
2>