Mike Taylor dismisses Perl with a pithy reference to a section of its excellent documentation. For some reason, I mis-remembered that he was complaining about the flip-flop operator rather than context in general.

So, I’ve come to defend the flip-flop operator, and the opposition hasn’t turned up! Oh well, never mind.

In scalar context, “..” returns a boolean value. The operator is bistable, like a flip-flop, and emulates the line-range (comma) operator of sed, awk, and various editors. Each “..” operator maintains its own boolean state. It is false as long as its left operand is false. Once the left operand is true, the range operator stays true until the right operand is true, AFTER which the range operator becomes false again.

Scanning Logfiles

So, say your logfile looks something like this:

... 100,000 lines ... 10:22:25.279 The first interesting line ... 30 more interesting lines ... 10:22:25.772 Another interesting line 10:22:25.772 The last interesting line 10:22:25.779 And then this line isn't interesting any more ... 100,000 lines ...

If you specify the beginning timestamp and end timestamp then you will get one uninteresting line which you can strip with head -n-1 .

And that is it. Pretty easy eh?

jared@localhost $ cat flip-flop.muse \ > | perl -ne 'print if /^10:22:25.279/ .. /^10:22:25.779/' \ > | head -n-1 \ > | mail jared 10:22:25.279 The first interesting line ... 30 more interesting lines ... 10:22:25.772 Another interesting line 10:22:25.772 The last interesting line

Notes:

In a regex I often use an unescaped period (.) to match a period if it doesn’t matter like here

And for anyone thinking useless use of cat… it’s deliberate.

Just kidding Mike.