[erlang-questions] Fw: Erlang n00b figuring out bins

Adrian Roe <>
Tue Sep 24 21:46:32 CEST 2013


Initial message failed - retrying  

-- 
Adrian Roe
Sent with Sparrow (http://www.sparrowmailapp.com/?sig)


Forwarded message:

> From: Adrian Roe <>
> To: 
> Cc: 
> Date: Tuesday, 24 September 2013 20:44:41
> Subject: Re: [erlang-questions] Erlang n00b figuring out bins
> 
> The first thing I'd say is to ask why you want a list of strings (lists) - I initially went down the strings are lists route but am definitely in the strings as binaries camp now, as are an increasing number of Erlang projects.  Definitely a question of style, but the style du jour appears to be binaries. Also the example you give doesn't run for me (as I'd expect) - binary_to_list( [<<"s">>, <<"t">>, <<"u">>, <<"f">>, <<"f">>]) is trying to convert a list of binaries rather than a binary which is what it expects
> 
> Eshell V5.10.1  (abort with ^G)
> 1> binary_to_list( [<<"s">>, <<"t">>, <<"u">>, <<"f">>, <<"f">>]).
> ** exception error: bad argument
>      in function  binary_to_list/1
>         called as binary_to_list([<<"s">>,<<"t">>,<<"u">>,<<"f">>,<<"f">>])
> 
> 
> That aside there are two jobs going on there:
> You need to split the input on "."
> You want the output as a list of strings (= list of lists)
> 
> You can go about that in (at least) two different ways
> 
> Split the binary and convert the binary parts into strings
> Convert the input to a list and split it
> 
> Thankfully there are library calls that do just what you need.  Lets look at splitting then converting - binary:split/2 looks like it does the job
> 
> Eshell V5.10.1  (abort with ^G)
> 1> X = <<"stuff.junk.excess">>.
> <<"stuff.junk.excess">>
> 2> binary:split(X, [<<".">>]).
> [<<"stuff">>,<<"junk.excess">>]
> 
> 
> Close, but not quite what we want as it has only split on the first occurrence.  Thankfully there's binary:split/3 which gives us a little more control
> 
> 3> binary:split(X, [<<".">>], [global]).
> [<<"stuff">>,<<"junk">>,<<"excess">>]
> 
> 
> Perfect - now we just need to convert the binary strings into lists.  Maybe something like
> 
> 4> [binary_to_list(Y) || Y <- binary:split(X, [<<".">>], [global])].
> ["stuff","junk","excess"]
> 
> 
> Again with the other approach (convert then split), there's a function that does what we need - string:tokens/2.  This expects a string (aka list) as input
> 
> 5> string:tokens(binary_to_list(X), ".").
> ["stuff","junk","excess"]
> 
> 
> Not sure if any of that counts as "more graceful" but more widely you should definitely stick with it - Erlang is certainly worth the initial head-scratching.
> 
> Adrian
> -- 
> 
> Dr Adrian Roe
> Sent with Sparrow (http://www.sparrowmailapp.com/?sig)
> 
> 
> On Tuesday, 24 September 2013 at 15:46,  (mailto:) wrote:
> 
> > I've done a lot of development, but it's been quite a while since I've done anything
> > functional.  Erlang is still brand-new for me, so be warned. 
> > 
> > I've got a (conceptual) string arriving in my sw as a binary, e.g. <<"stuff.junk.excess">>
> > and trying to transform it into a list of strings, e.g. ["stuff", "junk", "excess"]
> > The mechanism I'm using is giving me a list of lists of binaries, e.g.
> >  [ [<<"s">>, <<"t">>, <<"u">>, <<"f">>, <<"f">>], [<<"j">>, <<"u">>   (etc)
> > 
> > I ended up hacking it to just take each of the lists of binaries and run it through
> > list_to_binary and then binary to list.  The result is what I really wanted, which is 
> >     list_to_binary(binary_to_list( [<<"s">>, <<"t">>, <<"u">>, <<"f">>, <<"f">>]))
> > gives me back
> >     "stuff"
> > 
> > That's all well and good, and functional, but has two problems:
> > 1) I honestly don't get why it worked; I would expect those two operations to
> >     give me back something unchanged.
> > 2) There's got to be a more graceful way to achieve this.
> > 
> > Thoughts?
> > 
> > 
> > 
> > _______________________________________________
> > erlang-questions mailing list
> >  (mailto:)
> > http://erlang.org/mailman/listinfo/erlang-questions
> > 
> > 
> > 
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20130924/4767e4e5/attachment.html>


More information about the erlang-questions mailing list