2012-02-17 4 views
4

Использование только list_to_atom() дает:Erlang строки на атом и форматирование строки

list_to_atom("hello"). 
hello 
list_to_atom("Hello"). 
'Hello' 

почему разница?

Я пытаюсь форматировать строку с числами, строками и атомами следующим образом:

lists:flatten(io_lib:format("PUTVALUE ~p ~p", [list_to_atom("hello"), 40])). 
"PUTVALUE hello 40" 
lists:flatten(io_lib:format("PUTVALUE ~p ~p", [list_to_atom("Hello"), 40])). 
"PUTVALUE 'Hello' 40" 

, что это лучший способ сделать это в Erlang?

Edit: Для того, чтобы этот вопрос ясно, есть больше значения, чем в примере выше, и в некоторых случаях значение может быть строкой или атом, как

lists:flatten(io_lib:format("PUTVALUE ~p ~p ~p", [list_to_atom("hello"), X, 40])). 

, где первый параметр всегда строка, но X может быть атомом или строкой. Третий параметр всегда является числом.

ответ

9

Если вы хотите, чтобы получить плоский список для строк и целых чисел, используя ~s и ~B может быть straitforward:

lists:flatten(io_lib:format("PUTVALUE ~s ~B", ["Hello", 40])). 
+2

+1 очень верно. Это позволяет избежать создания атома. –

+0

Спасибо за полезный ответ. что, если один из параметров может быть строкой или атомом? – mbsheikh

+1

атомы форматируются либо '~ s', либо' ~ p'. По '~ s', результаты не цитируются символами одиночной кавычки. См. Http://www.erlang.org/doc/man/io.html#format-1 для полной справки. – shino

5

Вы можете использовать списки: CONCAT для форматирования такой строки

lists:concat(["PUTVALUE ",hello," ",40]). 
Смежные вопросы