Что такое флип-флоп-оператор? - программирование
Подтвердить что ты не робот

Что такое флип-флоп-оператор?

В последнее время я слышал и читал о триггерах с регулярными выражениями в Perl и Ruby, но мне не удалось найти, как они действительно работают и каковы распространенные случаи использования.

Может ли кто-нибудь объяснить это языком-агностиком?

Теперь, когда я понимаю, что это такое, и как это работает, я бы перефразировал вопрос просто: что такое флип-флоп-оператор?

4b9b3361

Ответ 1

Оператор триггера в Perl оценивает значение true, когда левый операнд имеет значение true и продолжает оценивать значение true до тех пор, пока правый операнд не будет истинным. Левым и правым операндом может быть любое выражение, но чаще всего оно используется с регулярными выражениями.

С регулярными выражениями полезно найти все строки между двумя маркерами. Вот простой пример, показывающий, как он работает:

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

Оператор флип-флоп будет истинным для всех строк от start до this is the end.

Двухточечная версия оператора позволяет первыми и вторыми регулярными выражениями совпадать с одной и той же строкой. Итак, если ваши данные выглядели так, вышеуказанная программа была бы верна только для строки start blah end:

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

Если вы не хотите, чтобы первое и второе регулярные выражения совпадали с одной строкой, вы можете использовать трехточечную версию: if (/start/ ... /end/).

Обратите внимание, что следует соблюдать осторожность, чтобы не путать оператора триггера с оператором диапазона. В контексте списка .. имеет совершенно другую функцию: он возвращает список последовательных значений. например

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

Я не знаком с Ruby, но ссылка Ли Джарвис предполагает, что он работает аналогично.

Ответ 2

Вот прямой перевод Ruby из демонстрации @dan1111 (иллюстрирующий, что Ruby украл больше, чем flip_flop от 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

Больше идиоматического рубина:

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