Doh! I'm an idiot. Thanks. I had turned on warnings, but not strict. Surprisingly, warnings showed nothing -- I was expecting to get something from using the return value of /ad/ as an array index when /ad/ failed to match.
But yes, I somehow completely missed the fact that I was using the same array for both purposes. I think my subconscious was thinking that because I was using array refs, I was using $f not @f. Stupid subconscious.
Another case of being blinded by thinking it was too simple for such an obvious problem to hide...