2009-09-11 30 views
10

Tôi có một chuỗi với một số bộ phận ngăn cách bởi tab:Làm thế nào tôi có thể chia chuỗi thành hai phần với Perl?

Hello\t2009-08-08\t1\t2009-08-09\t5\t2009-08-11\t15 

Tôi muốn chia nó lên chỉ trên tab đầu tiên, do đó "Hello" kết thúc trong $k và và phần còn lại kết thúc trong $v. Điều này không hoàn toàn hoạt động:

my ($k, $v) = split(/\t/, $string); 

Tôi làm như thế nào?

+3

Thực ra, tôi chỉ đọc tài liệu cho phần tách(), bị bối rối; googled, và đến đây. Tôi tìm thấy câu trả lời ở đâu. – Chap

Trả lời

36

Để có được điều đó, bạn cần phải sử dụng các tham số thứ 3 để split(), mang đến cho các chức năng một số lượng tối đa của trường để chia thành (nếu dương):

my($first, $rest) = split(/\t/, $string, 2); 
+0

Điều gì sẽ xảy ra nếu độ dài của giá trị không chắc chắn và tôi muốn nắm bắt tất cả giá trị trong $ v. Định dạng $ v sẽ trông giống như ngày_1 \ tvalue_1 \ tdate_2 \ tvalue_2 \ tdate_3 \ tvalue_3 ... – biznez

+2

Điều này sẽ ghi lại "date_1" bằng $ k và "value_1 \ tdate_2 \ tvalue_2 \ tdate_3 \ tvalue_3 ..." bằng $ v. Để biết thêm thông tin, tôi liên kết với trang tham chiếu perldoc trên hàm 'split()' - nó sẽ giải thích nó hoạt động như thế nào trong tất cả các chi tiết mà bạn có thể muốn. Tôi đề nghị bạn đọc nó. Perldoc rất thông tin. –

7

số Nó sẽ cung cấp cho bạn hai mục đầu tiên và quăng phần còn lại. Hãy thử điều này:

my ($k, $v) = split(/\t/, $string, 2); 
+0

Điều gì sẽ xảy ra nếu độ dài của giá trị không chắc chắn và tôi muốn nắm bắt tất cả giá trị đó trong $ v. Định dạng $ v sẽ trông giống như date_1 \ tvalue_1 \ tdate_2 \ tvalue_2 \ tdate_3 \ tvalue_3 ... – biznez

+0

Giống như Chris Lutz đã nói trong nhận xét của mình, số này cho Perl biết có bao nhiêu phần được chia thành. Vì vậy, với giá trị là 2, phần đầu tiên đi vào $ v, phần đầu tiên được tiêu thụ trong phần tách và phần còn lại của chuỗi sẽ không bị thay đổi thành $ v. –

1

Một tùy chọn khác sẽ là sử dụng một regex đơn giản.

my($k,$v) = $str =~ /([^\t]+)\t(.+)/; 
Các vấn đề liên quan