Как удалить персонажа из списка в Erlang

Я пытаюсь удалить персонажа из списка

например:

List = "/hi",

так что я не хочу удалить это "/" из списка

как мне это сделать?

2 ответа

Решение

Потому что переменные Эрланга являются неизменными и

List = "/hi".

связывает List к выражению "\hi"Вы не можете просто удалить что-либо из List; на самом деле, вы не можете изменить List в любом случае, пока он остается связанным.

Вместо этого вы можете связать другую переменную, называемую T ниже, к хвосту List, вот так:

1> List = "/hi".
"/hi"
2> T=tl(List).
"/hi"
3> T.
"hi"

Поскольку строки в Erlang представляют собой списки символов, общий способ удаления первого вхождения символа из строки состоит в использовании списков: delete / 2:

1> List = "/hi".
"/hi"
2> lists:delete($/, List).
"hi"

Конструкция $/ является литералом символа Erlang для / персонаж.

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

3> List2 = "one/word".
"one/word"
4> lists:delete($/, List2).
"oneword"

Просто помните, что при таком подходе удаляется только первое вхождение символа. Чтобы удалить все вхождения, сначала используйте string:tokens/2 разделить всю строку на данный символ:

5> List3 = "/this/looks/like/a/long/pathname".
"/this/looks/like/a/long/pathname"
6> Segments = string:tokens(List3, "/").
["this","looks","like","a","long","pathname"]

Обратите внимание, что string:tokens/2 принимает его разделитель в виде списка, а не просто один элемент, поэтому на этот раз наш разделитель "/" (или эквивалентно, [$/]). Наш результат Segments это список строк, которые мы теперь должны объединить. Мы можем использовать либо lists:flatten/1 или же string:join/2 для этого:

7> lists:flatten(Segments).
"thislookslikealongpathname"
8> string:join(Segments, "").
"thislookslikealongpathname"

Второй аргумент string:join/2 это разделитель, который вы можете вставить между сегментами, но здесь мы просто используем пустую строку.

Другие вопросы по тегам