2009-09-10 4 views
5

문자열 목록이나 그냥 문자열을 포함 할 수있는 변수가 있습니다. 내가 어떤 대우를하고 있는지 말할 수있는 좋은 방법이 있습니까?목록이 문자열인지 또는 문자열 목록인지 어떻게 확인할 수 있습니까?

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

두 경우 모두 관련된 비트를 사용하고 싶습니다.

+1

이렇게하는 가장 좋은 방법은 이러한 상황을 피하는 것입니다. 예 : 요소가 하나라도있는 경우에도 요소 목록을 사용하십시오. 또는 튜플을 사용하여 문자열 대신 IP를 나타낼 수 있습니다. 모호성을 피할 수있는 방법은 언제나 있습니다 – gleber

+0

gleber : 동의하지만, 지금은 불행하게도 그런 종류의 변화를 도입 할 수없는 레거시 코드를 다루고 있습니다. – Fylke

답변

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의 플랫 목록인지 테스트하는 다른 기능을 구현합니다.

당신의 particulary IP 문자열을 확인하기위한 하나 개의 좋은 선택 io_lib입니다 : latin1_char_list (기간) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1

io_lib이 :/1 기능 구현이 latin1_char_list :

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. 

당신이 평면 유니 코드를 테스트하려면 char_list (기간) http://erlang.org/doc/man/io_lib.html#char_list-1

io_lib : char_list/1 기능 구현이 io_lib을 사용할 수 있습니다리스트 is :

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/lib/*/src 소스 코드를 검색하고 필요한 새로운 기능을 간단하게 얻으십시오.

관련 문제