in reply to Return Values from IPC::Run

I think you'll need to simplify this considerably, before someone (including you) will be able to unravel it. What I would suggest is that you begin by removing calls to subs. If you're relying on values to be set by those subs, simply assign them. As you do this, you may at some point notice that the mysterious exit code changes to zero, which would give you an idea of where your problem lies. For this reason, I would make the changes piecemeal, not all at once.

Also, you might try sprinking "reality checks" throughout your code, warn or print statements that show the values of variables at various points. Often you may find some variable contains the wrong value, which can then screw up subsequent code. It might be helpful to log these to a file so you can examine them at your leisure.