applejacks has asked for the wisdom of the Perl Monks concerning the following question:

Please point out the obvious to me :-) I've read in a file and built a hash with a single key and value pair. assume $input{red}= "yellow"; I'm trying to build a second hash using the values in the first hash. for example: $newhash = { new_value => $input{red} }; with the hope that $newhash{new_value} would have a value of "yellow". I am obviously doing something wrong.... Can someone please help me with this? Is there a different approach I should be taking? Thanks!

Replies are listed 'Best First'.
Re: Hash creation
by FunkyMonk (Bishop) on May 02, 2008 at 19:23 UTC
    $newhash is a reference to a hash rather than a hash, so
    print $newhash->{new_value};

    will print "yellow".


    Unless I state otherwise, all my code runs with strict and warnings
Re: Hash creation
by igelkott (Priest) on May 02, 2008 at 19:23 UTC

    Just too many brackets.

    $newhash{new_value} = $input{red};
      Thanks for your replies..... I'm not sure they fix my problem. Here is my code creating the first hash:

      foreach (@inputfields) {
      ($fname, $fvalue)=split(/:/, $_);
      $inputs{$fname}=$fvalue; }

      Here is the code for the second hash:
      $defref = {
      requester_name => $inputs{"Requester Email"},
      requester_email => $inputs{"Project Manager Name"} }

      Where the actual "Requester Email" and "Project Manager Name" are actual key values (i.e. $fname). As far as I can tell, nothing ever gets loaded into $defref. I am making illegal references? Thanks!

        A few points:

        • You appear to have associated the email key with the name value and vice versa when creating your defref anonymous hash. I have changed them around in the code below
        • You can populate the %inputs hash without the need for the $fname and $fvalue intermediate variables by using map
        • Always put use strict; and use warnings at the top of your scripts to enforce disciplinr and catch errors
        • The Data::Dumper module is worth it's weight in doughnuts when you are not sure what your data structures look like. I use it below to show what we started with and what has ended up in the hashes
        Here's the code

        use strict; use warnings; use Data::Dumper; my @inputFields = ( q{Requester Email:fredb@big.com}, q{Project Manager Name:Fred Bloggs}, ); my %inputs = map { split m{:} } @inputFields; my $defRef = { requester_email => $inputs{ q{Requester Email} }, requester_name => $inputs{ q{Project Manager Name} }, }; print Data::Dumper->Dumpxs( [ \ @inputFields, \ %inputs, $defRef ], [ qw{*inputFields *inputs defRef} ], );

        and here's the output

        @inputFields = ( 'Requester Email:fredb@big.com', 'Project Manager Name:Fred Bloggs' ); %inputs = ( 'Requester Email' => 'fredb@big.com', 'Project Manager Name' => 'Fred Bloggs' ); $defRef = { 'requester_name' => 'Fred Bloggs', 'requester_email' => 'fredb@big.com' };

        I hope this is helpful.

        Cheers,

        JohnGG

        Did you already tried to print the desired values from %inputs to see if they are really set?

        Did you check, what's defined in %inputs (maybe a Typo bothers you here)?

        I would check if $inputs{"Requester Email"} exists and is defined when assigning it as new Value..e.g.

        $derfref = { new_key => exists $inputs{old key} and defined $inputs{old key} ? $inputs{old key} : "--no old key--" };
Re: Hash creation
by Jenda (Abbot) on May 03, 2008 at 19:00 UTC

    Do add "use strict;" on top of your scripts. Always!

    Your problem is that you are confusing hashes and hash references and are accessing two different variables ... which is something use strict would tell you.

    The $newhash{key} accesses the key within the %newhash variable (notice the change of the sigil!), on the other hand the $newhash = { new_value => $input{red} }; sets the scalar variable $newhash to the reference to an anonymous hash containing one key ("new_value") and one value ($input{red}). The %newhash and $newhash are tow different, completely unrelated variables.

    If you want to define a hash you have to use % and () instead of $ and {}: my %newhash = ( new_value => $input{red}) and then to access the value by $newhash{new_value}.

    Or you can use the reference: my $newhash = { new_value => $input{red} }; and access the value by $newhash->{new_value}.