Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Hash Problem!

by Anonymous Monk
on Sep 30, 2008 at 00:30 UTC ( #714446=perlquestion: print w/ replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks!
I have a Perl program that prints this to a text file. I read this file in and given the REGIS#, YEAR, ACCOUNT values from a html/form page, how can I return the AMOUNT for this request, this is hash of hashes right?

'main_data' => [ { 'LEVEL' => '12', 'CARNUM' => '1', 'REGIS#' => '1233456678987645RD ', 'ACCOUNT' => '6510334', 'YEAR' => '2008' }, { 'AMOUNT' => '200.00' }, { 'LEVEL' => '0', 'CARNUM' => '2', 'REGIS#' => '2234565478345R56T ', 'ACCOUNT' => '6510334', 'YEAR' => '2008' }, { 'AMOUNT' => '0.00' } ],

Thanks for the help!!!

Comment on Hash Problem!
Download Code
Re: Hash Problem!
by NetWallah (Abbot) on Sep 30, 2008 at 00:56 UTC
    No - this is not a HOH - it is a HOAOH.

    Try:

    # Assuming your outside hash is named %h, print $h{main_data}[1]{AMOUNT} . "\n";
    Update: A somewhat more advanced approach: (Assuming %h is the outside hash)
    for (map {@$_} values %h){ print "Account " . $_->{ACCOUNT} . " AMOUNT: " if exists $_->{ACCOUN +T}; next unless exists $_->{AMOUNT}; print $_->{AMOUNT} . "\n"; } # --- Output --- # Account 6510334 AMOUNT: 200.00 # Account 6510334 AMOUNT: 0.00

         Have you been high today? I see the nuns are gay! My brother yelled to me...I love you inside Ed - Benny Lava, by Buffalax

      AOH not HOAOH
        If you are talking about the content inside the [..], then I'd agree that it contains an AOH.

        From my perspective, the outermost
        'main_data' => [...
        indicates that it is either a hash or hashref. Of course, the programmer could be misusing the "=>" instead of a comma, making the outermost element an array, but that is marginally perverse.

        So. in the absence of information to the contrary, I'll stick with my interpretation of HOAOH.

             Have you been high today? I see the nuns are gay! My brother yelled to me...I love you inside Ed - Benny Lava, by Buffalax

Re: Hash Problem!
by GrandFather (Cardinal) on Sep 30, 2008 at 01:15 UTC

    It would be much better for the Perl program that generates the data to write it to a database. However, going with what you have been given:

    use warnings; use strict; use Data::Dump::Streamer; my $data = <<DATA; 'main_data' => [ { 'LEVEL' => '12', 'CARNUM' => '1', 'REGIS#' => '1233456678987645RD ', 'ACCOUNT' => '6510334', 'YEAR' => '2008' }, { 'AMOUNT' => '200.00' }, { 'LEVEL' => '0', 'CARNUM' => '2', 'REGIS#' => '2234565478345R56T ', 'ACCOUNT' => '6510334', 'YEAR' => '2008' }, { 'AMOUNT' => '0.00' } ], DATA local $\; open my $InFile, '<', \$data; my $str = <$InFile>; close $InFile; no strict "vars"; eval "\%hash = ($data);"; my %accounts; while (@{$hash{main_data}}) { my ($accountInfo, $amount) = splice @{$hash{main_data}}, 0, 2; my $acct = $accountInfo->{ACCOUNT}; my $reg = $accountInfo->{'REGIS#'}; delete @{$accountInfo}{'ACCOUNT', 'REGIS#'}; $accounts{$acct}{$reg} = $accountInfo; $accounts{$acct}{$reg}{AMOUNT} = $amount->{AMOUNT}; } use strict; print "$accounts{6510334}{'1233456678987645RD '}{AMOUNT}";

    Prints:

    200.00

    Perl reduces RSI - it saves typing
      Would be possible to add the amount 'AMOUNT' => '200.00' to the first hash right after the 'LEVEL' => '12', because these values belong to the information above them, and they are separated making things more difficult.
        If I understand the meaning of your question correctly, then the answer is no. It is certainly possible to add anything you want to any of the hashes, but, if you mean by “right after” that there should be some ordering, then you can't achieve that. If you just want it to appear in the same hash, and don't care (as you mustn't) about ordering, then (as moritz pointed out when you asked the same question before) why not just do what you're suggesting and test the result yourself?
Re: Hash Problem!
by moritz (Cardinal) on Sep 30, 2008 at 07:56 UTC
    my %hash = ( 'main_data' => [ { 'LEVEL' => '12', 'CARNUM' => '1', 'REGIS#' => '1233456678987645RD ', 'ACCOUNT' => '6510334', 'YEAR' => '2008' }, { 'AMOUNT' => '200.00' }, { 'LEVEL' => '0', 'CARNUM' => '2', 'REGIS#' => '2234565478345R56T ', 'ACCOUNT' => '6510334', 'YEAR' => '2008' }, { 'AMOUNT' => '0.00' } ]); my @amounts = map { $_->{AMOUNT} } @{$hash{main_data}}; print "@amounts\n";
      Would be possible to add the amount 'AMOUNT' => '200.00' to the first hash right after the 'LEVEL' => '12', because these values belong to the information above them, and they are separated making things more difficult.
        Sure it's possible. What have you tried so far? where have you had problems?

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://714446]
Approved by GrandFather
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (5)
As of 2014-08-30 17:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (293 votes), past polls