punkish,
First, It is not clear what should happen if a "Blue" is encountered interleaved amongst the 4 "White"s. Setting that aside for a second, I would probably do something much simpler. A rough outline follows:
- Establish a scalar to store "Blue"
- Establish an array to store "White"
- If line is not "Blue", "White", or "Red" - skip
- If "Blue", replace whatever $blue is with this line
- If "White", shift @white if @white > 3, then push line on @white
- If "Red", just read the values in $blue and @white
- Working forward should be self-explanatory
Update: Since you just need the last N values, it is quite simple to take one off one end of the array and put a new one on the other end. If, on the other hand, you needed to keep track of the top N values, it is a bit more complicated. See Better mousetrap (getting top N values from list X)