2010-09-14 23 views
21

Tôi đã nhận thấy một số hành vi tò mò với lệnh tách của Perl, đặc biệt trong trường hợp tôi mong đợi mảng kết quả chứa chuỗi rỗng '', nhưng thực tế thì không.Perl tách với văn bản trống trước/sau dấu phân cách

Ví dụ, nếu tôi có dấu phân tách ở cuối (hoặc đầu) của chuỗi, mảng kết quả không có một chuỗi rỗng (s) '' làm phần tử cuối cùng (hoặc đầu tiên).

Ví dụ:

@s = split(/x/, 'axb') 

sản xuất 2 phần tử mảng [ 'a', 'b']

@s = split(/x/, 'axbx') 

sản xuất cùng một mảng

@s = split(/x/, 'axbxxxx') 

sản xuất cùng một mảng

Nhưng ngay khi tôi đặt thứ gì đó t Cuối cùng, tất cả những chuỗi rỗng làm xuất hiện như các yếu tố:

@s = split(/x/, 'axbxxxxc') 

tạo ra một mảng 6 yếu tố [ 'a', 'b', '', '', '', 'c']

Hành vi là tương tự nếu các dấu phân cách ở đầu.

Tôi dự kiến ​​văn bản trống giữa, trước hoặc sau dấu phân cách luôn tạo ra các phần tử trong phần tách. Bất cứ ai có thể giải thích cho tôi tại sao sự phân chia cư xử như thế này trong Perl? Tôi vừa thử điều tương tự trong Python và nó hoạt động như mong đợi.

Lưu ý: Perl v5.8

Trả lời

44

Từ the documentation:

Theo mặc định, các lĩnh vực hàng đầu có sản phẩm nào được bảo toàn, và những người trailing trống sẽ bị xóa. (Nếu tất cả các trường trống, chúng được coi là dấu gạch chéo.)

Điều đó giải thích hành vi bạn đang nhìn thấy với các trường cuối. Điều này thường có ý nghĩa, vì mọi người thường rất bất cẩn về khoảng trắng dấu vết, ví dụ. Tuy nhiên, bạn có thể nhận được các lĩnh vực trống trailing nếu bạn muốn:

split /PATTERN/,EXPR,LIMIT

Nếu LIMIT là tiêu cực, nó được coi là nếu một LIMIT tùy tiện lớn đã được chỉ định.

Vì vậy, để có được tất cả các lĩnh vực có sản phẩm nào trailing:

@s = split(/x/, 'axbxxxxc', -1); 

(tôi giả sử bạn đã thực hiện một sai lầm bất cẩn khi nhìn vào các lĩnh vực có sản phẩm nào hàng đầu - họ chắc chắn được bảo toàn Hãy thử split(/x/, 'xaxbxxxx') Kết quả có kích thước.. 3.)

+4

Khi trích dẫn từ tài liệu, vui lòng bao gồm liên kết đến tài liệu có liên quan. Tôi đã thêm nó cho bạn lần này. – cjm

+0

Wow Tôi cảm thấy khá ngu ngốc khi không đi thẳng vào tài liệu. Và vâng, bạn nói đúng, tôi phải có một số lỗi bất cẩn khi kiểm tra các không gian hàng đầu, chỉ cần thử lại và thấy chúng được bảo tồn.Cảm ơn bạn đã lưu ý về việc đặt giới hạn -1, điều đó đã giúp tôi! – Roman

+0

@cjm cảm ơn; Tôi hứa tôi thường làm! – Cascabel

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