2012-02-06 41 views
8

Tôi có một vấn đề nhỏ. Tôi muốn chia một dòng tại mỗi ký tự ống tìm thấy bằng cách sử dụng toán tử phân chia. Giống như trong ví dụ này.tách trên ký tự ống trong perl

echo "000001d17757274585d28f3e405e75ed|||||||||||1||||||||||||||||||||||||" | \ 
perl -ane '$data = $_ ; chop $data ; @d = split(/\|/ , $data) ; print $#d+1,"\n" ;' 

Tôi mong chờ một ouput của 36 như awk tách với delimiter | trở 36, nhưng thay vào đó tôi nhận được 12, như thể chia dừng lại ở 1 nhân vật trong dòng.

echo "000001d17757274585d28f3e405e75ed|||||||||||1|||||||||||||||||||||||||||||||||||||||" | \ 
awk -F"|" '{print NF}' 

Bất kỳ ý tưởng nào. Tôi đã thử nhiều cách để trích dẫn số |, nhưng không thành công. Rất cám ơn trước.

Trả lời

16

Theo split:

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 trailing trống được xóa.

Bạn cần phải xác định một giới hạn tiêu cực đến sự chia rẽ để có được những cái đuôi:

split(/\|/, $data, -1) 
+0

Vì vậy, cảm ơn nhiều. Tôi đã thực hiện loại phân chia này rất nhiều lần và không bao giờ rơi vào cái bẫy này trước đây. – saudic

+2

+1 - Hầu hết mọi người không nhận ra điều này cho đến khi họ chạy vào hoàn cảnh chính xác này và họ kiểm tra. Theo lập trình, nó không có sự khác biệt. Nếu tôi muốn kiểm tra liệu một giá trị được định nghĩa 'if (được định nghĩa $ my_array [$ field])' sẽ hoạt động có hay không có một mục '$ my_array [$ field]' có giá trị không xác định hoặc không có trường nào được xác định '$ my_array [$ field]'. –

+2

"Có lập trình", có những khác biệt rất lớn. ví dụ. 'for (@myarray)', 'join ($ sep, @myarray)', v.v. – ikegami

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