Как удалить персонажа из списка в 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
это разделитель, который вы можете вставить между сегментами, но здесь мы просто используем пустую строку.