First of all, my congratulations for discovering Data::Dumper, you will never go anywhere without it ;)
This is a common problem with CGI's param method. It's being called in list context in this case. If the CGI form did not include a value for rs$i, then param("rs$i") in list context will return an empty list. The empty list just gets flattened away in a hash construction:
{
number => 1,
name => "test",
id => "test",
rollSizzle => (),
roll => undef,
sizzle => undef
}
## is the same as
{
number => 1,
name => "test",
id => "test",
rollSizzle => "roll",
undef => "sizzle",
undef
}
This explains the output you're getting. You can fix it by forcing scalar context:
{
number => $number,
name => scalar param("n$i"),
id => scalar param("id$i"),
rollSizzle => scalar param("rs$i"),
roll => $temp,
sizzle => $temp
};
At some point, this problem has bitten
everyone who's ever done CGI programming with CGI.pm, and I wish there were an option to pass to CGI.pm to force scalar context behavior for all calls to
param. I rarely use forms where multiple fields are named the same, so
param's list context is rarely useful for me...
Now that I think of it, I will probably start changing the tops of my CGI scripts from now on:
# use CGI 'param';
use CGI; sub param { scalar CGI::param(@_) }