in reply to dynamic loading of modules

There's nothing magical about BEGIN blocks - they just get done before (nearly) everything else. Once you know that it will make perfect sense about why $mod1 has no value when you're trying to use it in the require.

On a related note, I would suggest that you try to find a way to avoid programatic require statements. There's nothing particularly wrong with them, but they reduce the ability for you to easily check whether your code compiles correctly and also means that code inspection tools (like Doxygen automatic documentation generation) won't be able to determine dependencies etc.