Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re: Multi-stage flip-flop?

by roboticus (Chancellor)
on Dec 11, 2014 at 01:28 UTC ( [id://1110000]=note: print w/replies, xml ) Need Help??


in reply to Multi-stage flip-flop?

RonW:

Here's an alternative, though the syntax isn't as nice as your proposed syntax:

#!/usr/bin/env perl use strict; use warnings; my $fn = \&doOtherProcessing; while (<DATA>) { if (/for/) {$fn = \&doStage1} if (/their/) {$fn = \&doStage2} if (/fruit/) {$fn = \&doStage3} if (/lazy/) {$fn = \&doOtherProcessing} $fn->($_); } sub doStage1 { print "1: ",shift } sub doStage2 { print "2: ",shift } sub doStage3 { print "3: ",shift } sub doOtherProcessing { print "*: ",shift } __DATA__ now is the time for all good men to come to the aid of their party. Time flies like an arrow fruit flies like a banana. The quick red fox jumps over the lazy brown dog. Etaoinshrdlu.

Basically we're just using $fn to be a combination state variable / function pointer to track the current state of your chain of comparisons, and selecting a different handler at each match:

*: now is the time 1: for all good men to 1: come to the aid of 2: their party. 2: Time flies like an arrow 3: fruit flies like a banana. 3: The quick red fox *: jumps over the lazy *: brown dog. *: Etaoinshrdlu. *:

...roboticus

When your only tool is a hammer, all problems look like your thumb.

Replies are listed 'Best First'.
Re^2: Multi-stage flip-flop?
by RonW (Parson) on Dec 11, 2014 at 02:15 UTC

    Almost. Your code is not qualifying the state before changing it.

    Maybe like this:

    my @fn = (\&doOtherProcessing, \&doStage1, \&doStage2, \&doStage3); my $fn = 0; while (<DATA>) { if ($fn == 0 and /for/) {$fn = 1} if ($fn == 1 and /their/) {$fn = 2} if ($fn == 2 and /fruit/) {$fn = 3} if ($fn == 3 and /lazy/) {$fn = 0} $fn[$fn]->($_); }

      RonW:

      Good catch! I won't update my post, as you've already posted a suitable fix.

      ...roboticus

      When your only tool is a hammer, all problems look like your thumb.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1110000]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (3)
As of 2024-04-26 00:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found