2012-02-29 24 views
14

Tôi nhận được lỗi này mặc dù tôi đã khai báo biến regex của mình.Sử dụng giá trị chưa được khởi tạo trong đối sánh mẫu (m //)

my $pattern = '(Cat\.\sNo\.\s\d+)';

Sau đó trong mã của tôi tôi sử dụng sau đó $pattern.

if ($page =~ /$pattern/) 
{ 
    push(@array, $element); 
} 

Nhưng khi tôi chạy mã của tôi nó mang lại cho tôi những lỗi dưới đây, và tiếp tục chạy thành công:

Use of uninitialized value in pattern match (m//) 

Một tìm kiếm trên Google cho lỗi này dường như để trỏ đến các tình huống nơi mà các biến có không được khởi tạo, mặc dù trong trường hợp của tôi có vẻ như tôi đã khởi tạo nó rồi?

+0

Ông có thể cho chúng ta thấy nhiều mã? '$ Page' và' $ element' được xác định ở đâu? Tôi nghi ngờ một vấn đề phạm vi biến. – Toto

Trả lời

19

Thông báo đó không cho bạn biết rằng $pattern chưa được khởi tạo; nó cho bạn biết rằng $page chưa được khởi tạo. Nếu bạn đang mong rằng $page có thể uninitialized, và đó là OK, sau đó bạn có thể bỏ qua các cảnh báo, và làm cho mọi việc rõ ràng cho độc giả tương lai của mã nguồn, bằng cách viết này:

if (defined($page) && ($page =~ /$pattern/)) 
+0

Ok Tôi đã cập nhật mã trong câu hỏi gốc .. Vì vậy, trong trường hợp này cả hai '$ page' và' $ element' đã được khởi tạo trước đó với 'my $ page' và' my $ element'. Tuy nhiên, tôi vẫn nhận được lỗi uninitialised? – kurotsuki

+0

Chỉ cần một lưu ý khác, tôi đã khởi tạo $ page và $ element với các giá trị mặc định trống, tức là "" – kurotsuki

+1

'my $ page' không * khởi tạo *' $ page', nó chỉ * khai báo *. 'my $ page;' tương đương với 'my $ page = undef;', và là * not * tương đương với 'my $ page = '';'. Ngay trước câu lệnh 'if' của bạn, nếu bạn thêm câu lệnh' if (được xác định là $ page) {print "\ $ trang được khởi tạo \ n"; } else {print "\ $ page không được khởi tạo \ n"; } ', nó in gì? – ruakh

1

Vấn đề isn' t $pattern - vấn đề là $element

Một test nhanh sẽ tạo ra kết quả tương tự:

use strict; 
use warnings; 

my $pattern = '(Cat\.\sNo\.\s\d+)'; 
my $element =~ /$pattern/; 
Các vấn đề liên quan