in reply to Writing portable code

Perl has neat ways to manage namespaces, so you can avoid singletons, esp for procedural code

If you're going for conditional compilation optimize the code use Devel::CheckOS();
use constant WIN32 => !! Devel::CheckOS::os_is('MicrosoftWindows');

This probably doesn't apply to your codebase, but a common mental block is developing your app in a single file when it naturally lends itself to multiple files

Write/develop/test the code normally in seperate files -- don't complicate development by limited thinking about distribution :)

You can combine it into a single file for distribution later, using fatpack/pp/ http://www.cavapackager.com/ or whatever

PAR/pp can pack your script/modules only without including core modules, but you probably think that's too heavy (requires installing/packing PAR)

fatpack is lighter, and you can fatpack YourApp::Linux/YourApp::Windows, and offer linuxapp.pl/windowsapp.pl downloads

or you can use 'cat' with autosplit/autoload like BrowserUk suggests