2011-08-06 26 views
8

Theo như tôi biết trong cờ '/ g' toàn cầu có nghĩa là tìm kiếm sẽ thay thế/trả về tất cả các kết quả khớp trong suốt chuỗi. Nhưng tôi không thể hiểu được cách thức mà nó phản ứng với các biến toàn cầu trong khi phù hợp với, ai đó có thể giải thích tại sao có sự chênh lệch giữa đầu ra của hai chương trình mẫu:Giúp hiểu cờ toàn cầu trong perl

Phiên bản 1:

my $text = 'This is sample float value 3.2 '; 

getFloat(); 
getFloat(); 

sub getFloat(){ 
    if ($text =~ /([0-9]+?)(.?)([0-9]+?)/is){ 
     print "matched> $1$2$3 "; 
    } 
} 

Output: hợp> 3.2 hợp> 3,2

Version 2: (với cờ toàn cầu)

my $text = 'This is sample float value 3.2 '; 

getFloat(); 
getFloat(); 

sub getFloat(){ 
    if ($text =~ /([0-9]+?)(.?)([0-9]+?)/gis){ 
     print "matched> $1$2$3 "; 
    } 
} 

Output: hợp> 3,2

Như đã thấy từ đầu ra, với kết hợp cờ toàn cầu xảy ra một lần duy nhất. Ai đó có thể giải thích hành vi này.

+0

Bạn nên xem [perldoc perlretut] (http://perldoc.perl.org/perlretut.html#Using-regular-expressions- in-Perl) – TLP

+0

Bạn đang mong đợi điều gì? Bạn muốn nó tiếp tục khớp cho đến khi nó không khớp? Điều đó có nghĩa là điều kiện 'if' sẽ luôn là sai. Tóm lại, 'if (/.../ g)' không có ý nghĩa gì cả. – ikegami

Trả lời

10

Với công cụ sửa đổi g, chuỗi nhớ vị trí của trận đấu cuối cùng của nó, vì vậy bạn có thể yêu cầu kết hợp với một vòng lặp g trong một khoảng thời gian và tìm tất cả các kết quả phù hợp.

Nếu không có g bạn bắt đầu lại mỗi lần và luôn tìm thấy kết quả phù hợp đầu tiên.

Trong trường hợp của bạn, với số g, bạn đã so khớp 3.2 lần đầu tiên, nhưng lần thứ hai bạn cố gắng khớp, không còn kết quả phù hợp nữa.

Nếu không có g bạn có thể gọi getFloat() một tỷ lần và bạn sẽ luôn tìm thấy kết quả khớp đầu tiên.

+0

Cảm ơn bạn đã trả lời câu hỏi –

8

Khi được sử dụng trong ngữ cảnh danh sách, /g làm cho =~ trả về tất cả các kết quả phù hợp. Khi được sử dụng trong ngữ cảnh vô hướng, /g làm cho =~ trả lại một kết quả phù hợp mỗi khi được sử dụng và sau đó không thành công (trả về undef) khi không còn kết quả trùng khớp nữa, trước khi bắt đầu lại ở đầu chuỗi. (Bạn có thể ngăn chặn điều này bằng cách sử dụng /gc.) Bạn cũng có thể sử dụng chức năng pos($text) để tìm hoặc đặt vị trí bắt đầu trận đấu.

Nếu không có /g, =~ luôn trả về cùng một kết quả mỗi lần. Điều này tương đương với việc đặt pos($text) thành undef mỗi lần. (Trong ngữ cảnh danh sách, thay vào đó, =~ sẽ trả lại danh sách các ảnh chụp.)

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