2013-01-22 36 views
14

Tôi đã nghe và đọc về flip-flops với cụm từ thông dụng trong Perl và Ruby gần đây, nhưng tôi không thể tìm thấy cách chúng thực sự hoạt động và trường hợp sử dụng phổ biến là gì.Nhà điều hành flip-flop là gì?

Có ai có thể giải thích điều này theo cách bất khả tri về ngôn ngữ không?

Bây giờ tôi hiểu nó là gì và cách hoạt động, tôi sẽ thuật lại câu hỏi đơn giản: Nhà điều hành flip-flop là gì?

+1

Bạn chứ không phải nghĩa regexps trong dep Lê? – choroba

+0

Vâng, đó là những gì tôi thực sự nên hỏi :) – samuil

Trả lời

12

Toán tử flip-flop trong Perl đánh giá là true khi toán hạng bên trái là đúng và tiếp tục đánh giá là true cho đến khi toán hạng bên phải là đúng. Toán hạng trái và phải có thể là bất kỳ dạng biểu thức nào, nhưng thường được sử dụng với các regex.

Với regexes, nó rất hữu ích cho việc tìm kiếm tất cả các dòng giữa hai điểm đánh dấu. Dưới đây là một ví dụ đơn giản cho thấy cách hoạt động:

use Modern::Perl; 

while (<DATA>) 
{ 
    if (/start/ .. /end/) 
    { 
     say "flip flop true: $_"; 
    } 
    else 
    { 
     say "flip flop false: $_"; 
    } 
} 

__DATA__ 
foo 
bar 
start 
inside 
blah 
this is the end 
baz 

Các lật điều hành flop sẽ đúng đối với tất cả các dòng từ start cho đến khi this is the end.

Phiên bản hai chấm của toán tử cho phép regex thứ nhất và thứ hai cho cả hai đối sánh trên cùng một dòng. Vì vậy, nếu dữ liệu của bạn trông như thế này, chương trình trên sẽ chỉ có đúng đối với dòng start blah end:

foo 
bar 
start blah end 
inside 
blah 
this is the end 
baz 

Nếu bạn không muốn regexes đầu tiên và thứ hai để phù hợp với cùng một dòng, bạn có thể sử dụng ba phiên bản chấm: if (/start/ ... /end/).

Lưu ý rằng cẩn thận không nên nhầm lẫn giữa nhà điều hành flip-flop với toán tử dải. Trong ngữ cảnh danh sách, .. có chức năng hoàn toàn khác: nó trả về một danh sách các giá trị tuần tự. ví dụ.

my @integers = 1 .. 1000; #makes an array of integers from 1 to 1000. 

Tôi không quen với Ruby, nhưng Lee Jarvis's link cho thấy rằng nó hoạt động tương tự.

+1

Ruby: https://gist.github.com/baa007793b683ce3c5ca –

7

Dưới đây là bản dịch của Ruby trực tiếp của bản demo @ dan1111 của (minh họa rằng Ruby đã đánh cắp hơn flip_flop từ Perl):

while DATA.gets 
    if $_ =~ /start/ .. $_ =~ /end/ 
    puts "flip flop true: #{$_}" 
    else 
    puts "flip flop false: #{$_}" 
    end 
end 

__END__ 
foo 
bar 
start 
inside 
blah 
this is the end 
baz 

Nhiều thành ngữ ruby:

DATA.each do |line| 
    if line =~ /start/ .. line =~ /end/ 
    puts "flip flop true: #{line}" 
    else 
    puts "flip flop false: #{line}" 
    end 
end 

__END__ 
foo 
bar 
start 
inside 
blah 
this is the end 
baz 
+0

mát mẻ, chỉ cần đọc về nhà điều hành flip-flop ngày khác trong khi kiểm tra ra perl, tốt để biết rằng ruby ​​(Tôi đi đến ngôn ngữ kịch bản) cũng có nó –

+0

Tại sao mỗi 'dòng' lại được in ra, thay vì chuỗi flip-flop? – onebree