Tôi muốn thêm vào câu trả lời của James với một số ví dụ cụ thể. Tôi đã sử dụng toán tử này để lấy ra các phần văn bản dựa trên các biểu thức chính quy.
Tôi đã viết một công cụ liên quan đến việc chạy các lệnh trên máy chủ từ xa thông qua Net :: SSH. Máy chủ cụ thể này có thói quen gây phiền nhiễu khi in MOTD bất kể phiên có phải là phiên đăng nhập hay không. Điều này dẫn đến việc nhận được rất nhiều rác khi tôi chạy một lệnh và lấy ra đầu ra. Vì tôi không có nhiều ảnh hưởng trong cài đặt máy chủ, tôi đã tạo một tập lệnh nhỏ để in ra dấu phân cách, chạy chương trình và sau đó in dấu phân cách khác. Đầu ra trông như thế này.
Welcome to Server X!
+----------------------------------------------------------------------+
| Use of this server is restricted to authorized users only. User |
| activity may be monitored and disclosed to law enforcement personnel |
| if any possible criminal activity is detected. |
+----------------------------------------------------------------------+
----------------------------------------------
Setting up environment for user Adam.
----------------------------------------------
>>>>>>>>>>>>>>>>>>>>>>>>>
Program Output
<<<<<<<<<<<<<<<<<<<<<<<<<
Toán tử flip-flop là một phím tắt hữu ích để chỉ lấy phần mã với đầu ra tôi cần. Tôi đã sử dụng một regex mà phù hợp với 25 lớn hơn thans ">" để bắt đầu trận đấu, và 25 ít-thans "<" để kết thúc trận đấu.
output.each { |line| puts line if line[/^>{25}/] .. line[/^<{25}/] }
Output
>>>>>>>>>>>>>>>>>>>>>>>>>
Program Output
<<<<<<<<<<<<<<<<<<<<<<<<<
Hầu hết các ví dụ tôi đã nhìn thấy đã liên quan đến việc kéo khối dữ liệu ra khỏi một tập tin hoặc mảng dựa trên biểu thức thông thường. Một số ví dụ khác đến với tâm trí là kéo ra các xung đột hợp nhất git, một số bản ghi từ các hệ thống tệp phẳng kế thừa (như các cấu trúc được viết thành tệp) và các tệp nhật ký.
Về cơ bản, bất kỳ lúc nào bạn cần phải rút ra các phần dựa trên dữ liệu bắt đầu và kết thúc thay vì chỉ nội dung của một dòng riêng lẻ. Nó phức tạp hơn một chút so với chỉ một regex đơn giản, nhưng ít phức tạp hơn việc viết một trình phân tích cú pháp.
Nguồn
2013-01-30 20:09:08
-1: mã chưa được kiểm tra. Bạn nghĩ điều này là gì, perl? bạn cần 'print if ($ _ = ~/third /) .. ($ _ = ~/fifth /)' (Tôi biết nó không phải là mã của bạn, nhưng không cần phải tiếp tục phát tán mã sử dụng các tính năng không dùng nữa). – rampion
Việc sử dụng thực tế cho điều này là gì? Khi nào tôi có thể cần in các dòng từ 3 đến 5 từ một tệp (đủ thời gian để làm cho nó đáng giá)? – kajaco
Quên khoảng 3 và 5. Đó là về việc trích xuất một phần của tệp được giới hạn bởi thẻ bắt đầu và thẻ kết thúc. Tôi hy vọng bạn thấy tốt hơn lý do tại sao đó là một ví dụ thế giới thực .. Bây giờ phiên bản không flip-flop tương đương sẽ liên quan đến việc thêm biến cho nhà nước, nhiều hơn nếu báo cáo: chỉ là mã phức tạp hơn. – inger