Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: Not So Complex Hash Question

by davorg (Chancellor)
on Jul 01, 2009 at 19:47 UTC ( [id://776552]=note: print w/replies, xml ) Need Help??


in reply to Not So Complex Hash Question

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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://776552]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (4)
As of 2024-03-29 01:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found