2015-11-16 41 views
0

我試圖從proplist中刪除單個頂級元素。我將如何去做這件事。Erlang:從proplist中刪除單個元素

我有一個proplist變種,像這樣:

[{listA,[a,b,c]},{listB,[d,e]}] 

那麼我將如何從刪除listA的頂級元素?

+1

http://www.erlang.org/doc /man/lists.html < - 這可能有幫助。 – fizix00

+0

當我使用proplist時,我試圖使用proplist:delete,但是這肯定會刪除listA中的所有元素,而我只是想刪除它。 – User

+0

http://www.erlang.org/doc/man/proplists.html#lookup-2 你能用這樣的東西來「索引」第一個元素,然後刪除它嗎? – fizix00

回答

3

您可以使用lists:keytake/3來獲取元素,然後修改它,並把它放回去:

1> List = [{listA,[a,b,c]},{listB,[d,e]}]. 
[{listA,[a,b,c]},{listB,[d,e]}] 
2> lists:keytake(listA, 1, List). 
{value,{listA,[a,b,c]},[{listB,[d,e]}]} 
3> {value, {listA, [_|Items]}, Options} = lists:keytake(listA, 1, List). 
{value,{listA,[a,b,c]},[{listB,[d,e]}]} 
4> [{listA, Items}|Options]. 
[{listA,[b,c]},{listB,[d,e]}] 
+0

這將刪除整個列表,它是否是刪除一個元素的相同原理,具有不同的功能? – User

+0

對不起,我誤解了這個問題。我已經更新了答案。 –

+0

我可以永久刪除此刪除嗎? – User

2
remove_head(Name, PropList) -> 
    lists:reverse(
     remove_head(Name, PropList, []) 
    ). 

remove_head(_Name, [], Results) -> Results; 

remove_head(Name, [ {Name, [_H|T]} | Tail ], Results) -> 
    remove_head(Name, Tail, [{Name, T}|Results]); 

remove_head(Name, [H|T], Results) -> 
    remove_head(Name, T, [H|Results]). 

例子:

47> c(my). 
{ok,my} 

48> P1= [ 
48> {listA, [a,b,c]}, 
48> {listB, [d,e]} 
48> ]. 
[{listA,[a,b,c]},{listB,[d,e]}] 

49> my:remove_head(listA, P1).              
[{listA,[b,c]},{listB,[d,e]}] 

50> P2 = [ 
50> {listA, [a,b,c]}, 
50> {listB, [d,e]}, 
50> {listA, [y, x, x]} 
50> ]. 
[{listA,[a,b,c]},{listB,[d,e]},{listA,[y,x,x]}] 

51> my:remove_head(listA, P2). 
[{listA,[b,c]},{listB,[d,e]},{listA,[x,x]}]