It's been a few years since I used Parse::RecDescent, so it might be that my expectations are wrong, but I was under the impression that once some text had matched a rule, that same text would not be used to match a subsequent rule.
Excluding the actions that I take (printing the result) and the subrules (which are all regexes), the relationship between the rules is this:
start : (index pre risk) | (pre risk)
risk : (risk1 | risk2)
index : (pre1 | pre2 | pre3)
pre : (pre1 | pre2 | pre3)
Most of my test cases match the 'index pre risk' pattern, often using the same pre# rule for both the index and pre matches. However, in 8 out of my 100 cases, the index and pre match are matching exactly the same line (as seen in both the output and $thisline).
Perhaps someone more familiar with P::RD could tell me if this is something they've seen before, and how I might prevent it.
Update: I do have a minimal test case, but because the sample data file is so large I don't want to attach it to this post.