Doh! I see it.
This is very clever; compiled class and substr(). The only apparent downside is the fixed record length, but I could probably find a workable value for them. Given the roughly 5x overhead of Class::Struct, the savings ought to be well worth it.
Let me PM you about error checking, etc. Thanks so much.