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);
--

See the Copyright notice on my home node.

Perl training courses


In reply to Re: Not So Complex Hash Question by davorg
in thread Not So Complex Hash Question by NateTut

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.