2009-12-02 17 views
15

Các docs cho qr/STRING/ nói:Nhà điều hành qr/STRING/ở Perl quyết định có nên biên dịch STRING không?

Toán tử này có dấu ngoặc kép (và có thể biên dịch) STRING của nó như là một biểu thức chính quy .

Điều gì khiến tôi lo lắng là một phần trong dấu ngoặc đơn. Tôi không thể nghĩ ra bất kỳ trường hợp nào mà tôi không muốn nó biên dịch regex từ số STRING. Có phải câu lệnh cha mẹ này chỉ chần chừ để che giấu một số trường hợp trong tương lai không biên dịch hay có trường hợp nào ngày hôm nay (hoặc trong phiên bản cũ hơn của Perl), nơi STRING sẽ không được biên soạn?

+9

"Từ chồn"? Trong thánh thư của chúng ta? Bạn phải đùa. – innaM

+2

Vâng, đó là những từ chồn. – ysth

Trả lời

13

Các "có thể biên dịch" một phần của tài liệu có thể đề cập đến những tình huống như một hiển thị dưới đây, nơi mà các lập luận để qr// là một regex đã được biên soạn:

use re 'debug'; 

$re1 = qr/foo/; 
$re2 = qr/$re1/; 

Chạy chương trình đó chỉ hiển thị một regex đang được biên soạn.

Bất kể mục đích của đoạn văn đó, những ám chỉ tinh tế về chi tiết nội bộ không làm rõ tài liệu. Tôi nghĩ rằng một bản vá tài liệu sẽ có lợi.

+1

Bingo! Chạy lệnh này với 'use re 'debug'' xác nhận nó. – innaM

1

Nếu regex chứa bất kỳ chuỗi nội suy nào, nó luôn biên dịch (có thể không nếu bạn sử dụng nút chuyển/o - tôi thú nhận/o luôn làm tôi bối rối). Nếu regex chỉ chứa chữ, tôi tin rằng câu trả lời của Adam là chính xác.

IIRC nó có nghĩa là để xử lý tình huống này:

while (my $foo = $something->next) { 
    my $regex1 = qr/ab(cd+)ef?/; # only compiled once 
    my $regex2 = qr/ab${foo}*ef/; # compiled every time through the loop 
    # do stuff with $regex1 and $regex2 
} 
+1

Nếu đây là ý nghĩa của nó thì nó bị nói rất nặng. –

2

Edit: Câu trả lời này là sai (hoặc ít nhất là sai lầm) nhưng có một số cuộc thảo luận thú vị trong các ý kiến ​​đó là giá trị bảo tồn. John Siracusa's answer dường như đang đi đúng hướng.


Các tài liệu cho qr// khẳng định rằng

STRING được nội suy theo cùng một cách như PATTERN trong m/PATTERN /.

có lẽ bao gồm hành vi không biên dịch lại biểu thức chính quy mà mẫu không thay đổi hoặc không thể thay đổi trong trường hợp không bao gồm biến nội suy. Ví dụ, bạn không cần phải biên dịch lại mô hình này trên mỗi lần lặp của vòng lặp:

foreach my $char ('a' .. 'z') { 
    my $vowel = qr/[aeiou]/; 
    say "$char is a vowel" if $char =~ $vowel; 
} 
+0

Điều đó có liên quan gì đến phần tôi đã trích dẫn? Thực tế là Perl đang lưu vào bộ đệm biên dịch không có nghĩa là '$ nguyên âm' sẽ không được đưa ra một phiên bản được trích dẫn và biên dịch của' STRING'. Cụm từ tôi hỏi về dường như có thể nói là có thể cho 'qr/STRING /' trả về phiên bản 'STRING' được trích dẫn nhưng chưa được biên dịch. Tôi hỏi nếu có bất kỳ trường hợp nào hiện tại hoặc trong quá khứ, nơi 'qr/STRING /' không trả về một regex đã biên dịch. Nếu không có trường hợp nào, thì có lẽ tôi nên gửi một bản vá để làm rõ tuyên bố đó. –

+0

Toán tử qr biên dịch nội dung của nó thành một regex mỗi khi nó gặp phải. (Nó thực hiện điều này bất kể sự hiện diện của một/o modifier.) Củng cố $ nguyên âm = qr/[aeiou]/dòng trên vòng lặp khoảng gấp đôi tốc độ thực hiện của bạn ví dụ trên hệ thống của tôi. –

+1

@John Siracusa Dường như có bộ nhớ cache, kiểm tra mã này: http://gist.github.com/247337 Nếu nó được biên dịch lại mọi lúc, thì thời gian chạy 'diff' và' same' sẽ giống nhau, nhưng 'cùng' nhanh gấp ba lần. Tôi nghĩ rằng sự khác biệt thời gian mà bạn đang thấy là thời gian cần thiết để tạo biến '$ nguyên âm' và gán regex được lưu trữ, biên dịch vào nó. –

Các vấn đề liên quan