2011-11-07 26 views
10

Trong Erlang khi bạn có danh sách các ký tự có thể in, một chuỗi của nó, nhưng một chuỗi cũng là danh sách các mục và tất cả các chức năng của danh sách có thể được áp dụng lên một chuỗi. Lý tưởng nhất, cấu trúc dữ liệu: chuỗi không tồn tại trong erlang.

Một phần mã của tôi cần phải chắc chắn rằng nội dung nào đó không chỉ là danh sách mà còn là một chuỗi. (Một chuỗi thực). Cần phải tách riêng các danh sách, ví dụ: [1,2,3,a,b,"josh"], từ chuỗi, ví dụ: "Muzaaya". Biểu thức bảo vệ is_list/1 sẽ hiển thị true cho cả chuỗi và danh sách. Không có người bảo vệ nào như is_string/1 và vì vậy điều này có nghĩa là tôi cần một đoạn mã sẽ đảm bảo rằng dữ liệu của tôi là một chuỗi. Chuỗi trong trường hợp này là danh sách chỉ có thể in được (chữ cái, cả hai chữ hoa và chữ thường) và có thể chứa các số, ví dụ: "Muzaaya2536 618 Joshua". tôi cần một đoạn mã (Erlang) mà sẽ kiểm tra cho tôi và đảm bảo rằng biến là một chuỗi, không chỉ là một danh sách. nhờphân biệt một chuỗi từ danh sách trong Erlang

+0

Xem thêm http://stackoverflow.com/questions/2479713/determining-if-an-item-is-a-string-or-a-list-in-erlang – legoscia

Trả lời

23

Bạn có hai chức năng trong module io_lib mà có thể hữu ích: io_lib:printable_list/1io_lib:printable_unicode_list/1 mà kiểm tra nếu đối số là một danh sách in latin1 hoặc unicode ký tự tương ứng.

+1

cảm ơn @rvirding, đây là giải pháp tiêu chuẩn hơn! –

5

sử dụng isprint (3) định nghĩa của các ký tự in -

isprint(X) when X >= 32, X < 127 -> true; 
isprint(_) -> false. 

is_string(List) when is_list(List) -> lists:all(fun isprint/1, List); 
is_string(_) -> false. 

bạn sẽ không thể sử dụng nó như một người bảo vệ, mặc dù.

+0

nhờ @ butter71, điều này cũng hoạt động rất tốt ! –

+0

Điều này làm việc cho bộ ký tự Latin1, nhưng điều quan trọng cần lưu ý là nó sẽ từ chối mã ký tự Unicode. – goncalotomas

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