Добавить новую строку после списка символов или двоичного файла - Erlang - PullRequest
0 голосов
/ 01 октября 2018

У меня есть такой список:

List = [<< "Счастливчик Лабон: Привет" >>, << "Счастливчик Лабон: Держи?" >>, << "Счастливчик Лабон": Alpine is ... ">>]

Я пытаюсь объединить все элементы в одну, но с новой строкой.

Моя попытка такая:

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 голосов
/ 01 октября 2018

Если вам просто нужно напечатать результат, используйте концепцию iolist:

iolist () = Maybe_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>

Таким образом вы избегаете ненужных копий промежуточных списков.

0 голосов
/ 02 октября 2018

В Эрланге есть такая вещь, которая называется 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 - это число двоичных файлов в вашем списке.Это не может быть более эффективным, чем это.Не происходит никакого копирования данных оригинальных двоичных файлов.Издержки очень минимальны, и вся стандартная библиотека, работающая с операциями ввода-вывода, поддерживает обработку iolists.Вы всегда можете изменить iolist на двоичный файл или выполнить операцию ввода-вывода с ним.

> 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

Операция ввода-вывода или преобразование в двоичный файл iolist - это операция O (N), где N - размер выходного сигнала.Это не может быть более эффективным, чем это.(Подсистема IO может даже использовать системный вызов writev (), который вообще исключает копирование любого буфера пользовательского пространства и делает IO еще более эффективным.) Простое практическое правило - использовать iolist, когда у вас нет веских причин не делать этого.

0 голосов
/ 01 октября 2018
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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...