I won't comment on your trying to "roll your own" CGI processing, ignoring the CGI.pm module. There have only been 1,000,000 posts on PM advising peoplenot to do this, so why add another?
Regarding the use of storable, my understanding is the module works on references to a data structure. You may want to check out some examples in the Perl Cookbook (pages 388 onwards. Now I have not used the "freeze / thaw" functions, but basically the process works like this:
my %complex_hash = ();
# now stick stuff in the hash
store (\%complex_hash, '/some/file/name');
# notice the use of the backslash, meaning you pass a reference
# later on . . .
$complex_hash_ref = retrieve('/some/file/name');
# or even
%complex_hash = %( retrieve('/some/file/name');
As I said, I dont know about nfreeze / thaw, but it may also require you pass a reference to the data structure, and thaw may return a reference.