在列表字符或二进制字符后添加新行-Erlang

时间:2018-10-01 14:09:51

标签: erlang

我有一个这样的列表:

  

列表= [<<“ 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..."

3 个答案:

答案 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>