Как отформатировать плоскую строку с целыми числами в ней на эрланге? - PullRequest
9 голосов
/ 28 июня 2011

В erlang я хочу отформатировать строку с целыми числами в ней, и я хочу, чтобы результат был сплющен. Но я получаю это:

io_lib:format("sdfsdf ~B", [12312]).                 
[115,100,102,115,100,102,32,"12312"]

Я могу получить желаемый результат, используя приведенный ниже код, но он действительно не изящен.

lists:flatten(io_lib:format("sdfsdf ~B", [12312])).
"sdfsdf 12312"

Есть ли лучшее форматирование строк с целыми числами в них, чтобы они были плоскими? В идеале, используя только одну функцию?

Ответы [ 2 ]

6 голосов
/ 28 июня 2011

Вы сглаживаете список, используя lists:flatten/1, как вы сделали в своем примере.

Если вы можете принять двоичный файл, list_to_binary/1 вполне эффективен:

1> list_to_binary(io_lib:format("sdfsdf ~B", [12312])).
<<"sdfsdf 12312">>

Однако, вопрос, зачем вам сначала нужен плоский список. Если это просто косметика, она вам не нужна. io:format/1,2,3 и большинство других функций порта (gen_tcp и т. Д.) Принимают так называемые глубокие списки ввода-вывода (вложенные списки с символами и двоичными файлами):

2> io:format([115,100,102,115,100,102,32,"12312"]).
sdfsdf 12312ok
2 голосов
/ 29 июня 2011

Существует причина эффективности, что io_lib: format возвращает глубокие списки. В основном это сохраняет вызов спискам: flatten.

Спросите себя почему вы хотите, чтобы список был сведен. Если вы собираетесь распечатать список или отправить его в порт или записать в файл, все эти операции обрабатывают глубокие списки.

Если вам действительно нужен какой-то плоский список по какой-то причине, просто сгладьте его. Или вы можете создать свой собственный формат my_io_lib :, который возвращает уплощенные списки, если вы считаете это важным.

(Если вы хотите сгладить список только по причинам отладки, то либо напечатайте свои строки с помощью ~ s, либо создайте выравниватель в модуле erlang с именем user_default. Примерно так:

 -module(user_default).
 -compile(export_all).
 %% either this:
 fl(String) ->
    lists:flatten(String).
 %% or this:
 pp(String) ->
     io:format("~s~n", [String]).

Затем вы можете использовать fl / 1 и print / 1 в оболочке Erlang (если, конечно, на вашем пути будет user_default.beam).

...