String Interpolation
From Erlang Community
| Revision as of 17:36, 24 September 2006 (edit) Ayrnieu (Talk | contribs) (shortened an example, added an Efficiency Guide ref, added a 'traditional string interpolation' answer) ← Previous diff |
Revision as of 04:46, 31 October 2006 (edit) (undo) Ayrnieu (Talk | contribs) (added io_lib example.) Next diff → |
||
| Line 1: | Line 1: | ||
| == Problem == | == Problem == | ||
| - | You want to create string using a mixture of literals and computed values. For example you want to display the current date is the string "Today's date is " | + | You want to create string using a mixture of literals and computed values. |
| - | + | For example you want to display the current date is the string "Today's date | |
| + | is " | ||
| == Solution == | == Solution == | ||
| - | Make use of Erlang's generic display procedure and variable argument list. For an easy case (displaying date and time), we can make use of the httpd_util:rfc1123_date/0 function to get a string date, and the built-in concatenation (++) operator to construct the string we want: | + | Make use of Erlang's generic display procedure and variable argument list. |
| + | For an easy case (displaying date and time), we can make use of the | ||
| + | httpd_util:rfc1123_date/0 function to get a string date, and the built-in | ||
| + | concatenation (++) operator to construct the string we want: | ||
| <code> | <code> | ||
| 1> BBBB = "Today's date and time is " ++ httpd_util:rfc1123_date() ++ ".\n". | 1> BBBB = "Today's date and time is " ++ httpd_util:rfc1123_date() ++ ".\n". | ||
| Line 11: | Line 15: | ||
| </code> | </code> | ||
| - | Although if we only construct this string to then immediately pass it off to a port, we can more efficiently: | + | Although if we only construct this string to then immediately pass it off to |
| - | <code> | + | a port, we can more efficiently: <code> |
| 2> BBBB = ["Today's date and time is ", httpd_util:rfc1123_date(), ".\n"]. | 2> BBBB = ["Today's date and time is ", httpd_util:rfc1123_date(), ".\n"]. | ||
| ["Today's date and time is ", "Fri, 20 Aug 2004 22:03:13 GMT", ".\n"] | ["Today's date and time is ", "Fri, 20 Aug 2004 22:03:13 GMT", ".\n"] | ||
| Line 18: | Line 22: | ||
| -- see the Efficiency Guide for more information about this. | -- see the Efficiency Guide for more information about this. | ||
| - | Other cases require that you use the generic io_lib formatting functions to create strings with the data you want. For example, we could achive the same result as follows: | + | Other cases require that you use the generic io_lib formatting functions to |
| - | <code> | + | create strings with the data you want. For example, we could achive the same |
| - | + | result as follows: <code> | |
| + | 3> io:fwrite("Today's date is ~s, ~s ~w ~w.\n", ["Fri", "Aug", 20, 2004]). | ||
| Today's date is Fri, Aug 20 2004. | Today's date is Fri, Aug 20 2004. | ||
| + | 4> io_lib:fwrite("Today's date is ~s, ~s ~w ~w.\n", ["Fri", "Aug", 20, | ||
| + | 2004]). [84, 111, 100, 97, 121, 39, 115, 32, 100, % abbreviated output. | ||
| + | 97, 116, 101, 32, 105, 115, 32, "Fri", 44, | ||
| + | 32, "Aug", 32, "20", 32, "2004", 46, 10] | ||
| + | 5> lists:flatten(v(4)). | ||
| + | "Today's date is Fri, Aug 20 2004.\n" | ||
| </code> | </code> | ||
| - | Finally, this unoptimized module offers more traditional string interpolation: | + | Finally, this unoptimized module offers more traditional string |
| - | <code> | + | interpolation: <code> |
| -module(template). | -module(template). | ||
| -export([subst/2]). | -export([subst/2]). | ||
| Line 35: | Line 46: | ||
| </code> | </code> | ||
| <code> | <code> | ||
| - | + | 6> Vars = [{patient,"Mary Becket"}, {diagnosis,"You are an octopus."}], | |
| - | + | 6> template:subst("E-bloodwork autodoctor: Dear $patient, today's checkup | |
| - | "E-bloodwork autodiagnosis: Dear Mary Becket, today's checkup indicated a problem: You are an octopus.\n" | + | indicated a problem: $diagnosis.\n", Vars). "E-bloodwork autodiagnosis: Dear |
| + | Mary Becket, today's checkup indicated a problem: You are an octopus.\n" | ||
| </code> | </code> | ||
| [[Category:CookBook]][[Category:StringRecipes]] | [[Category:CookBook]][[Category:StringRecipes]] | ||
Revision as of 04:46, 31 October 2006
Problem
You want to create string using a mixture of literals and computed values. For example you want to display the current date is the string "Today's date is "
Solution
Make use of Erlang's generic display procedure and variable argument list. For an easy case (displaying date and time), we can make use of the httpd_util:rfc1123_date/0 function to get a string date, and the built-in concatenation (++) operator to construct the string we want:
1> BBBB = "Today's date and time is " ++ httpd_util:rfc1123_date() ++ ".\n". "Today's date and time is Fri, 20 Aug 2004 22:03:13 GMT.\n" |
Although if we only construct this string to then immediately pass it off to
a port, we can more efficiently:2> BBBB = ["Today's date and time is ", httpd_util:rfc1123_date(), ".\n"]. ["Today's date and time is ", "Fri, 20 Aug 2004 22:03:13 GMT", ".\n"] |
-- see the Efficiency Guide for more information about this.
Other cases require that you use the generic io_lib formatting functions to create strings with the data you want. For example, we could achive the same
result as follows:
3> io:fwrite("Today's date is ~s, ~s ~w ~w.\n", ["Fri", "Aug", 20, 2004]).
Today's date is Fri, Aug 20 2004.
4> io_lib:fwrite("Today's date is ~s, ~s ~w ~w.\n", ["Fri", "Aug", 20,
2004]). [84, 111, 100, 97, 121, 39, 115, 32, 100, % abbreviated output.
97, 116, 101, 32, 105, 115, 32, "Fri", 44,
32, "Aug", 32, "20", 32, "2004", 46, 10]
5> lists:flatten(v(4)).
"Today's date is Fri, Aug 20 2004.\n"
|
Finally, this unoptimized module offers more traditional string
interpolation:
-module(template).
-export([subst/2]).
subst(Fmt,[]) -> lists:flatten(Fmt);
subst(Fmt,[{K,V}|T]) ->
{ok,Fmt1,_} = regexp:gsub(Fmt,"\\$" ++ atom_to_list(K),[V]),
subst(Fmt1,T).
|
6> Vars = [{patient,"Mary Becket"}, {diagnosis,"You are an octopus."}],
6> template:subst("E-bloodwork autodoctor: Dear $patient, today's checkup
indicated a problem: $diagnosis.\n", Vars). "E-bloodwork autodiagnosis: Dear
Mary Becket, today's checkup indicated a problem: You are an octopus.\n"
|

Digg It
Del.icio.us
Reddit
Facebook
Stumble Upon
Technorati

