2009-09-10 74 views
5

Tôi có một biến có thể chứa danh sách các chuỗi hoặc chỉ một chuỗi. Có cách nào tốt để nói tôi đang xử lý loại nào?Làm cách nào để xác định xem danh sách có chỉ là một chuỗi hoặc danh sách các chuỗi không?

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

Trong cả hai trường hợp, tôi muốn sử dụng các bit liên quan.

+1

Tôi đoán cách tốt nhất để làm điều này là tránh những tình huống như vậy. Ví dụ. sử dụng danh sách các phần tử ngay cả khi chỉ có một phần tử. Hoặc sử dụng tuples để biểu thị IP thay vì sử dụng chuỗi. Luôn luôn có một cách để tránh sự mơ hồ – gleber

+0

gleber: Đồng ý, nhưng bây giờ tôi rất tiếc khi xử lý mã cũ mà tôi không thể giới thiệu loại thay đổi đó – Fylke

Trả lời

5

Làm thế nào bạn làm điều đó phụ thuộc rất nhiều vào những gì bạn định làm gì với kết quả, hay đúng hơn là làm thế nào bạn có kế hoạch để làm điều đó. Vì vậy, nếu bạn quan tâm đến các bit:

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

hoặc nếu bạn không quan tâm đến thực sự kéo ngoài chuỗi/danh sách các chuỗi bạn có thể làm:

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

Có tôi hiểu bạn một cách chính xác ở đây? Tôi đã không đặt bất kỳ mã vào để thực sự kiểm tra xem những gì nên được chuỗi thực sự là chuỗi, điều này cần phải được thực hiện trước đó. một giải pháp thay thế sẽ là khi tạo chuỗi/danh sách các chuỗi này để luôn đặt nó vào một trong các định dạng.

1

đôi khi tôi viết một cái gì đó như:

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

Erlang thực hiện các chức năng khác nhau để kiểm tra xem danh sách có phải là danh sách phẳng trong mô-đun io_lib hay không.

Một lựa chọn tốt để kiểm tra chuỗi IP particulary của bạn là io_lib: latin1_char_list (Term) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1

io_lib: latin1_char_list/1 chức năng thực hiện là:

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. 

Nếu bạn muốn kiểm tra cho unicode phẳng danh sách bạn có thể sử dụng io_lib: char_list (Thời hạn) http://erlang.org/doc/man/io_lib.html#char_list-1

io_lib: char_list/1 function implementation là:

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. 

Kiểm tra tài liệu mô-đun io_lib cho các chức năng tương tự khác.

ý rằng nếu một số chức năng erlang mới bị thiếu từ dự án phiên bản erlang hỗ trợ hiện tại của bạn chỉ đơn giản là bạn có thể sao chép việc thực hiện các phiên bản erlang mới cung cấp và thêm chúng vào một module của riêng bạn. Tìm kiếm mã nguồn erlang/lib/*/src mới nhất và chỉ cần nhận các hàm mới mà bạn cần.

Các vấn đề liên quan