In Operators§
See primary documentation in context for infix ff
sub infix:<ff>(Mu $a, Mu $b)
Also called the flipflop operator, compares both arguments to $_
(that is, $_ ~~ $a
and $_ ~~ $b
). Evaluates to False
until the left-hand smartmatch is True
, at which point it evaluates to True
until the right-hand smartmatch is True
.
In effect, the left-hand argument is the "start" condition and the right-hand is the "stop" condition. This construct is typically used to pick up only a certain section of lines. For example:
my $excerpt = q:to/END/; Here's some unimportant text. =begin code This code block is what we're after. We'll use 'ff' to get it. =end code More unimportant text. END my @codelines = gather for $excerpt.lines { take $_ if "=begin code" ff "=end code" } # this will print four lines, starting with "=begin code" and ending with # "=end code" say @codelines.join("\n");
After matching the start condition, the operator will then match the same $_
to the stop condition and act accordingly if successful. In this example, only the first element is printed:
for <AB C D B E F> { say $_ if /A/ ff /B/; # OUTPUT: «AB» }
If you only want to test against a start condition and have no stop condition, *
can be used as such.
for <A B C D E> { say $_ if /C/ ff *; # OUTPUT: «CDE» }
For the sed
-like version, which does not try $_
on the stop condition after succeeding on the start condition, see fff.
This operator cannot be overloaded, as it's handled specially by the compiler.