2009-09-10 20 views
5

我有一個變量,可以包含一個字符串列表或只是一個字符串。有沒有一種很好的方式來說明我正在處理的是什麼?如何確定列表是否只是一個字符串或字符串列表?

"192.168.1.18" vs. ["192.168.1.18", "192.168.1.19"] 

無論哪種情況,我都想使用相關位。

+1

我想最好的辦法是避免這種情況。例如。即使只有一個元素,也要使用元素列表。或者使用元組來表示IP而不是使用字符串。總是有一種方法可以避免模糊 – gleber 2009-09-10 16:18:51

+0

gleber:同意,但現在我很遺憾地處理遺留代碼,我不能介紹這種變化 – Fylke 2009-09-10 16:45:14

回答

5

它是如何你做很大程度上取決於你打算用什麼樣的結果呢,或者說你打算怎麼辦呢。所以,如果你在位有興趣:

case MyVar of 
    [First|Rest] when is_list(First) -> ... First,Rest ...; 
    _ -> ... MyVar ... 
end 

,或者如果你不感興趣,實際上是拉開弦的弦/列表你可以這樣做:

if is_list(hd(MyVar)) -> ... ; 
    true -> ... 
end 

有我的理解是否正確嗎?我沒有寫任何代碼來檢查字符串應該是什麼字符串,這應該早些完成。 另一種方法是在生成此字符串/字符串列表時始終將其放入其中一種格式中。

1

我有時會寫一些東西,如:

case X of 
    [List|_] when is_list(List) -> 
     list_of_lists; 
    List when is_list(List) -> 
     list; 
    _ -> 
     not_a_list 
end 
1

Erlang實現了不同的函數來測試列表是否是模塊io_lib中的扁平列表。

檢查您的格外IP串的一個好的選擇是io_lib:latin1_char_list(期限) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1

io_lib:latin1_char_list/1功能的實現是:

latin1_char_list([C|Cs]) when is_integer(C), C >= $\000, C =< $\377 -> 
     latin1_char_list(Cs); 
latin1_char_list([]) -> true; 
latin1_char_list(_) -> false. 

如果你想測試平板的unicode列表中,您可以使用 io_lib:char_list(期限) http://erlang.org/doc/man/io_lib.html#char_list-1

io_lib:char_list/1功能的實現是:

char_list([C|Cs]) when is_integer(C), C >= 0, C < 16#D800; 
     is_integer(C), C > 16#DFFF, C < 16#FFFE; 
     is_integer(C), C > 16#FFFF, C =< 16#10FFFF -> 
    char_list(Cs); 
char_list([]) -> true; 
char_list(_) -> false. 

檢查io_lib模塊文檔以獲取其他類似功能。

注意如果一些新的Erlang函數從當前項目所支持的Erlang版本丟失,你可以簡單地複製實現新的Erlang版本提供,並將其添加到您自己的模塊。搜索最新的erlang/lib/*/src源代碼,只需獲取所需的新功能。

相關問題