Tôi đã viết một tập lệnh Perl nhỏ với các cụm từ thông dụng để nhận các thành phần HTML của trang web.Vòng lặp vô hạn bằng cách sử dụng cặp đối sánh Perl regex
Tôi biết đây không phải là cách tốt để thực hiện loại công việc này, nhưng tôi đang cố gắng kiểm tra kỹ năng regex của mình.
Khi chạy với một trong hai mẫu regex trong vòng lặp while nó chạy hoàn hảo và hiển thị đầu ra chính xác. Nhưng khi tôi cố gắng kiểm tra cả hai mẫu trong vòng lặp while thì mẫu thứ hai khớp với mọi thời gian và vòng lặp chạy vô hạn.
kịch bản của tôi:
#!/usr/bin/perl -w
use strict;
while (<STDIN>) {
while ((m/<span class=\"itempp\">([^<]+)+?<\/span>/g) ||
(m/<font size=\"-1\">([^<]+)+?<\/font>/g)) {
print "$1\n";
}
}
Tôi đang thử nghiệm các kịch bản ở trên với một đầu vào mẫu:
<a href="http://linkTest">Link title</a>
<span class="itempp">$150</span>
<font size="-1"> (Location)</font>
đầu ra mong muốn:
$150
(Location)
Cảm ơn bạn! Bất cứ sự giúp đỡ nào cũng được đánh giá cao!
Bạn sẽ phải tiếp cận điều này một cách khác nếu bạn đang xử lý nhiều dòng. Khi bạn xử lý dòng STDIN khôn ngoan bên trong của bạn trong khi vẫn làm cho vô dụng. Sử dụng trình phân tích cú pháp HTML sẽ là giải pháp dễ bị lỗi nhất. Bạn cũng có thể thử kết hợp các khối với toán tử flipflop '..' –
@mugenkenichi: Vô nghĩa. 'While' bên ngoài lặp lại trên các dòng của tệp và phần tử bên trong lặp lại qua các lần xuất hiện của mẫu trong dòng. Tại sao nội tâm 'trong khi' vô dụng? – Borodin
Nếu bạn đang xử lý nhiều dòng .. Tôi có nghĩa là nếu thẻ bắt đầu nằm trên một dòng khác với thẻ đóng. Dù sao, tất cả những trường hợp đó sẽ được xử lý tốt hơn với một trình phân tích cú pháp chuyên biệt. –