push @data, {%recordset};
That is probably a bit inefficient, as AFAIK it copies the hash to create the anonymous hash reference. Something like this would work:
my $recordset = {};
$recordset->{name} = "Item A";
$recordset->{price} = 9.99;
push @data, $recordset;
# start with a new hash reference
$recordset = {};
$recordset->{name} = "Item B";
$recordset->{price} = 4.99;
push @data, $recordset;
Of course, declaring my $recordset; inside the loop where you fill @data is probably the nicest approach.