Tôi có một danh sách ngày càng tăng các biểu thức chính quy mà tôi đang sử dụng để phân tích cú pháp thông qua các tệp nhật ký tìm kiếm các lỗi "thú vị" và các câu lệnh gỡ rối. Tôi hiện đang chia chúng thành 5 thùng, với hầu hết trong số chúng rơi vào 3 thùng lớn. Tôi có hơn 140 mẫu cho đến nay, và danh sách đang tiếp tục phát triển.Làm thế nào tôi có thể so khớp hiệu quả nhiều mẫu regex khác nhau trong Perl?
Hầu hết các cụm từ thông dụng đều đơn giản, nhưng chúng cũng khá độc đáo, vì vậy cơ hội của tôi để bắt nhiều kết quả phù hợp với một mẫu đơn rất ít. Bởi vì bản chất của những gì tôi phù hợp, các mẫu có xu hướng tối nghĩa và ít khi so khớp, vì vậy tôi đang làm một TON công việc trên mỗi dòng đầu vào với kết quả cuối cùng là nó không khớp với bất cứ điều gì, hoặc phù hợp một trong những cái chung chung ở cuối cùng.
Và vì số lượng đầu vào (hàng trăm megabyte tệp nhật ký), đôi khi tôi chờ một hoặc hai phút để tập lệnh kết thúc. Do đó mong muốn của tôi cho một giải pháp hiệu quả hơn. Tuy nhiên, tôi không quan tâm đến việc hi sinh sự rõ ràng về tốc độ.
Tôi hiện có các biểu thức thông thường thiết lập như thế này:
if (($line =~ m{Failed in routing out}) ||
($line =~ m{Agent .+ failed}) ||
($line =~ m{Record Not Exist in DB}) ||
...
Có cách nào tốt hơn về cơ cấu này vì vậy nó hiệu quả hơn, nhưng vẫn duy trì? Cảm ơn!
Chắc chắn là con đường để đi. Tôi có một ứng dụng hiện đang trong quá trình sản xuất sử dụng Regexp :: Assemble để so sánh chuỗi văn bản đến với danh sách 1.334 cụm từ để xem (nếu có) trong số đó nằm trong mỗi chuỗi. Mã đơn giản như địa ngục và chạy tốt đẹp và nhanh chóng. –