Ответ 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, но ссылка Ли Джарвис предполагает, что он работает аналогично.