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

Bob Ippolito bob@REDACTED
Tue Sep 24 21:57:10 CEST 2013


I think the desire to convert the binary to lists is a bit questionable in
the first place. Also, if it is text, binary_to_list/1 is probably the
wrong way to do it, since it will be a list of bytes in some encoding and
not unicode code points. unicode:characters_to_list/1 might be more
appropriate, but without any context it's hard to give good suggestions.


On Tue, Sep 24, 2013 at 12:46 PM, Adrian Roe <roe.adrian@REDACTED> wrote:

>  Initial message failed - retrying
>
> --
> Adrian Roe
> Sent with Sparrow <http://www.sparrowmailapp.com/?sig>
>
> Forwarded message:
>
>  *From:* Adrian Roe <roe.adrian@REDACTED>
> *To:* jasingleton.work@REDACTED
> *Cc:* erlang-programming@REDACTED
> *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, jasingleton.work@REDACTED 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
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
>
>
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20130924/ce7f51fa/attachment.htm>


More information about the erlang-questions mailing list