[erlang-questions] What is allowed in a pattern in terms of string concatenation?
Daniel Dormont
dan@REDACTED
Mon Jun 27 20:27:59 CEST 2011
On Jun 27, 2011, at 1:23 PM, Jachym Holecek wrote:
> # Daniel Dormont 2011-06-27:
>> Suppose I want to test that a certain string String1 ends with a certain
>> other string String2. The best I could come up with is:
>
> There are no strings in Erlang! :-)
>
Right, fair enough.
>> case string:substr(lists:reverse(String1), 1, length(String2)) of
>> String2 -> ok;
>> _ -> not_ok
>> end
>
> Kevin already pointed you to lists:suffix/2 which is good if suffix
> isn't statically known, and very easy on the eyes too. If suffix is
> known you could do:
>
> has_suffix(L) ->
> has_suffix2(lists:reverse(L)).
>
> has_suffix2("xiffus" ++ _) ->
> true;
> has_suffix2(_) ->
> false.
>
I was not familiar with lists:suffix. I am now :) and it works fine for my purposes.
> Which I think answers your other question. More precisely, AFAIU this
>
> has_suffix2("xiffus" ++ _)
>
> is just syntactic sugar for
>
> has_suffix2([$x, $i, $f, $f, $u, $s | _])
>
> So in a way you could perhaps say "++" isn't really supported in pattern
> matching (but other will know this with more certainty). One doesn't see
> "++" used very often overall, in my experience.
>
Ok.
> Also, this would have been so much cheaper (but harder to read) if you
> used binaries to represent strings:
>
> has_suffix(S, B) ->
> has_suffix2(byte_size(B) - byte_size(S), S, B).
>
> has_suffix2(N, _, _) when N < 0 ->
> false;
> has_suffix2(N, S, <<_:N/binary, D/binary>>) ->
> S == D.
>
Right, unfortunately in the place where my module will be called, the string values are in lists, not binaries.
> Or somesuch, you get the idea.
>
Dan
More information about the erlang-questions
mailing list