2011-06-21 38 views
5

xem xét như sau:Trong clojure tại sao tách một chuỗi từ một tập tin rỗng trở về 1 yếu tố?

=> (even? (count [])) 
true 

cho đến nay rất tốt. Bây giờ, hãy xem xét (giả sử tệp của tôi trống):

(odd? (count (str/split (slurp my-file) #"\|"))) 
true 

err ... tại sao vectơ được trả lại từ một tệp trống thậm chí không (không)?

=>(str/split (slurp my-file) #"\|") 
[""] 

Ahh, ai đó có thể giải thích lý do tại sao một chuỗi rỗng được trả lại trong trường hợp này?

Tôi đang cố xác định xem có số bản ghi lẻ trong tệp hay không.

Trả lời

7

clojure.string/split sử dụng java.util.regex.Pattern/split để thực hiện chia tách. Xem this question about Java để được giải thích. Cụ thể là, split trả về mọi thứ trước kết quả trùng khớp đầu tiên của mẫu của bạn là lần tách đầu tiên, ngay cả khi mẫu không khớp với nhau.

Cách kinh điển để kiểm tra xem bộ sưu tập (danh sách, mảng, bản đồ, chuỗi, v.v.) có trống hay không là gọi seq trên đó, sẽ trả lại nil cho bộ sưu tập trống.

(defn odd-number-of-records? [filename] 
    (let [txt (slurp filename)] 
    (when (seq txt) 
     (odd? (count (str/split txt #"\|")))))) 
+1

Trong trường hợp này, bạn cũng có thể chỉ cần kiểm tra số chuỗi đầu vào. '(let [...] (khi (pos? (đếm txt)) ...))' Tôi thấy điều này một chút sạch hơn, bởi vì nó không cần thiết phân bổ một đối tượng seq được vứt bỏ ngay lập tức. 'seq' trên cấu trúc dữ liệu đắt hơn so với' count'. – kotarak

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