2011-03-28 34 views
10

Tôi có một chuỗi mà tôi muốn chia nhỏ. Nhưng dấu phân tách được xác định trong thời gian chạy và vì vậy tôi cần chuyển nó thành một biến.Tại sao chia tách trên `|` (đường ống) không hoạt động như mong đợi?

Một cái gì đó như my @fields = split(/$delimiter/,$string); không hoạt động. Có suy nghĩ gì không?


Input:

abcd|efgh|23 

Dự kiến ​​Output:

abcd 
efgh 
23 
+2

đầu vào, đầu ra sản, và kết quả mong muốn của bạn sẽ là thông tin vô cùng hữu ích ... – Sean

+5

Bạn không có một "dấu phân cách", bạn có một "dấu phân tách". "Dấu phân tách" đánh dấu các giới hạn, ví dụ: nó ở cả hai đầu, giống như dấu ngoặc kép. Một "dấu tách" đi vào giữa các phần tử, như "|" trong ví dụ đầu vào của bạn. – tadmc

+0

có thể trùng lặp của [Làm cách nào để xử lý các ký tự đặc biệt trong một regex Perl?] (Http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters-in-a-perl-regex) – daxim

Trả lời

19

Bạn cần phải thoát khỏi delimiter của bạn, vì đó là một nhân vật đặc biệt trong biểu thức thông thường.

Lựa chọn 1:

$delimiter = quotemeta($delimiter); 
my @fields = split /$delimiter/, $string; 

Phương án 2:

my @fields = split /\Q$delimiter/, $string; 
+0

Để biết thêm thông tin, xem: 'perldoc perlretut',' perldoc perlre' và tìm kiếm/\\ Q/và xem 'perldoc -f quotemeta'. – shawnhcorey

+2

Đối số 'tách' không phải là dấu tách, mà là dấu tách. – tchrist

+0

Không theo 'phân chia theo perldoc -f':" Mọi thứ phù hợp với PATTERN được lấy làm dấu tách phân tách các trường ". – Sean

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