I'm actually surprised what you have is working, because my understanding is that your initialisation for @table wouldn't be called until after the Win32::OLE->MessageLoop() returns.
Your right about @table. Its broken, in the output its all undef. I failed at the closure. Should have put a BEGIN block around it.