Your code has a number of interesting quirks, but the main problem is caused by the fact that %HashOne is defined as a lexical variable within the FillHashOne() subroutine. This means that a new, empty, version of the variable is created each time you enter the subroutine and destroyed each time you leave the subroutine.
This is why state variables were introduced in Perl 5.10. Your code works as you want it to if you rewrite it like this:
#!/usr/bin/perl
use feature ':5.10';
use strict;
use warnings;
use constant false => 0;
use constant true => 1;
$| = true;
use Data::Dumper;
my $Hash = {};
sub FillHashOne
{
state %HashOne;
{
my ($Key, $Value) = @_;
if(!defined($Key))
{
return(\%HashOne);
}
else
{
$HashOne{$Key} = $Value;
}
}
}
$Data::Dumper::Indent = 3;
$Data::Dumper::Purity = true;
$Data::Dumper::Varname = 'Hash';
$Data::Dumper::Quotekeys = true;
$Hash->{'One'} = 1;
$Hash->{'Two'} = 2;
$Hash->{'Three'} = 3;
$Hash->{'String'} = 'Foo Bar';
print __LINE__ . ":Main:\$Hash:\n" . Dumper($Hash);
for (my $i = 0; $i < 10; $i++)
{
FillHashOne($i, "Value:\[$i\]");
}
$Hash->{'HashOne'} = FillHashOne(undef());
print __LINE__ . ":Main:\$Hash:\n" . Dumper($Hash);
For it to work in earlier versions of Perl, you need to move the definition of %HashOne out of the subroutine. It's probably a good idea to keep both the variable definition and the subroutine in the same naked block. Keeping your idiosyncratic indentation style, it would look like this:
#!/usr/bin/perl
use strict;
use warnings;
use constant false => 0;
use constant true => 1;
$| = true;
use Data::Dumper;
my $Hash = {};
{
my %HashOne;
sub FillHashOne
{
my ($Key, $Value) = @_;
if(!defined($Key))
{
return(\%HashOne);
}
else
{
$HashOne{$Key} = $Value;
}
}
}
$Data::Dumper::Indent = 3;
$Data::Dumper::Purity = true;
$Data::Dumper::Varname = 'Hash';
$Data::Dumper::Quotekeys = true;
$Hash->{'One'} = 1;
$Hash->{'Two'} = 2;
$Hash->{'Three'} = 3;
$Hash->{'String'} = 'Foo Bar';
print __LINE__ . ":Main:\$Hash:\n" . Dumper($Hash);
for (my $i = 0; $i < 10; $i++)
{
FillHashOne($i, "Value:\[$i\]");
}
$Hash->{'HashOne'} = FillHashOne(undef());
print __LINE__ . ":Main:\$Hash:\n" . Dumper($Hash);