2009-06-04 2 views

Trả lời

57

Đối với regex không có gì để làm - perl sẽ chỉ biên dịch chúng một lần.

if ($var =~ /foo|bar/) { 
    # ... 
} 

Đối với các regex được lưu trữ trong các biến bạn có một vài tùy chọn. Bạn có thể sử dụng toán tử qr// để xây dựng một đối tượng regex:

my $re = qr/foo|bar/; 

if ($var =~ $re) { 
    # ... 
} 

Đây là thuận tiện nếu bạn muốn sử dụng một regex ở nhiều nơi hoặc vượt qua nó để chương trình con.

Nếu mẫu regex là trong một chuỗi, bạn có thể sử dụng tùy chọn /o hứa perl rằng nó sẽ không bao giờ thay đổi:

my $pattern = 'foo|bar'; 

if ($var =~ /$pattern/o) { 
    # ... 
} 

Nó thường tốt hơn để không làm điều đó, mặc dù. Perl đủ thông minh để biết rằng biến không thay đổi và regex không cần phải biên dịch lại. Chỉ định /o có thể là một tối ưu hóa vi mô sớm. Nó cũng là một cạm bẫy tiềm năng. Nếu biến đã thay đổi bằng cách sử dụng /o sẽ khiến cho perl sử dụng regex cũ. Điều đó có thể dẫn đến khó chẩn đoán lỗi.

+3

Đây là sự thật; tuy nhiên, qr // đã được hỗ trợ trong nhiều năm nay (nó tồn tại từ 5,005 và tôi nghĩ rằng không có vấn đề gì với nó từ 5.8) – ephemient

+8

@ephemient Vâng, 5.10 có rò rỉ bộ nhớ khó chịu liên quan đến qr // (và biên dịch regexes) nói chung), nhưng điều đó đã được sửa. Nếu bạn đang sử dụng 5.10, bạn có thể kiểm tra xem bạn có bị rò rỉ bộ nhớ hay không bằng cách nói perl -e 'qr // while 1'. Tôi biết rằng phiên bản OS X của ActiveState Perl 5.10 vẫn bị hỏng. –

+2

Lưu ý từ năm 2016: công cụ sửa đổi '/ o' đã không được chấp nhận. Xem [câu hỏi này] (http://stackoverflow.com/q/550258/477563) để biết chi tiết. –

19

Đơn giản: Kiểm tra toán tử qr // (được ghi trong perlop trong Regexp Quote-Like Operators).

my $regex = qr/foo\d/; 
$string =~ $regex; 
+0

đẹp, có vẻ như có thể được sử dụng làm mẫu trong cấu trúc s ///. Nó vẫn còn được biên dịch trước hay nó được biên dịch lại trong trường hợp này? – akostadinov

+0

@akostadinov Nó vẫn còn được biên dịch trước. –