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

Hi guys, I have a data file like this
A,01,Newton,Issac,Physics, 5.6 B,144.56 B,1034.65 B,12.23 A,34,Einstein,Albert,Physics,12.22 B,2346.89 B,876.23 B,7656.81 B,745.21 B,25.63 B,89.56 B,7789.23
This is multiple record data with the definition of the record types being:
Record type A: Type,member number,Surname,Firstname,Job,Balance
Record type B: Type,TransactionAmount
Write a program to: Read the data from the file and populate a data structure that looks like this:
%accounts = ( ’78’ => { ’surname’ => ’Feynman’, ’firstname’ => ’Richard’, ’job’ => ’Physics’, ’balance’ => -17.34, ’transactions => [ 7412.36, 2589.35, 95.32, 12.85, 789.68 ], }, ’89’ => { ’surname’ => ’Merx’, ... },
I have create the structure as above but now I want to refer to one of the values in %accounts to do sth with it. E.G. Add a new transaction '-37' to member 'Feynman'. and Copy all the transactions for Feynman into an array called @trans. How can I do this? I tried sth like this
#!/usr/bin/perl use warnings; use strict; use Data::Dumper; my ( $number, %accounts ); while ( <DATA> ) { chomp; if ( /^A,/ ) { ( undef, $number, my @fields ) = split /,/, $_, -1; @{ $accounts{ $number } }{ qw/ surname firstname job balance / + } = @fields; } elsif ( /^B,/ ) { my $transaction = ( split /,/ )[ 1 ]; push @{ $accounts{ $number }{ transactions } }, $transaction; } } my $account_hash = $accounts->{78}; foreach my $transactions ($account_hash){ push @{ $account_hash{ transactions } }, '-42.37'; } print Dumper $account_hash{ transactions };

Replies are listed 'Best First'.
Re: get the value from a refernce array of hash
by ikegami (Patriarch) on Jul 02, 2009 at 00:15 UTC
    1. Locate the key that matches the name Feynman.

      my $surname = 'Feynman'; my @matching_ids = grep { $accounts{$_}{surname} eq $surname } keys(%accounts);
    2. Make sure @matching_ids has at least one matching record.

      die("No records matching surname $surname\n") if !@matching_ids;
    3. Handle multiple matches as you see fit.

    4. Get the transactions. They are located in

      @{ $accounts{$id}{transactions} }
Re: get the value from a refernce array of hash
by terjek (Sexton) on Jul 03, 2009 at 07:02 UTC
    as far as i can see, the hash of hashes you create is ok. your issue is how you use the hash later in your code.

    %account is a hash, so to get the correct hashref for a given key you would need to do :

    my $account_hash = $accounts{78};
    then to add a element to the arrayref that the transaction key points to:

    push @{$account_hash->{transactions}}, '-42.37';
    then to get the data out, use :

    my @trans = @{$account_hash->{transactions}}; have not tested my code, so no guarantees against typos.