Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re^5: Hash of Hashes from file

by scorpio17 (Canon)
on Apr 03, 2012 at 15:19 UTC ( [id://963264]=note: print w/replies, xml ) Need Help??


in reply to Re^4: Hash of Hashes from file
in thread Hash of Hashes from file

Yes, that should work. Then to add a new website/type, you could do this:
push( @{ $hoh{$user}{'Website'} }, 'website4'); push( @{ $hoh{$user}{'type'} }, 'type4'};

and to get all websites for a given user:

my @websites = @{ $hoh{$user}{'Website'} };

The syntax looks strange because you're storing an array ref, and have to dereference it.

Replies are listed 'Best First'.
Re^6: Hash of Hashes from file
by cipher (Acolyte) on Apr 03, 2012 at 16:01 UTC
    Thanks a lot,

    Can you also let me know how do I print all websites and types for each user ?

      If your data looks like this:

      %hoh = ( user1 => { Website => ['website1', 'website2', 'website3'], type => ['type1','type2','type3'], }, user2 => { Website => ['website1', 'website2', 'website3'], type => ['type1','type2','type3'], }, user3 => { Website => ['website1', 'website2', 'website3'], type => ['type1','type2','type3'], }, );
      Then try something like this (untested):
      for my $user (sort keys %hoh) { my @websites = @{ $hoh{$user}{'Website'} }; my @types = @{ $hoh{$user}{'type'} }; # assume we have the same number of each? unless (scalar(@websites) == scalar(@types)) { die "number of websites is different from number of types!"; } print "$user :\n"; for ( my $i=0; $i < scalar(@websites); ++$i) { print " $websites[$i]\n"; print " $types[$i]\n"; } print "\n"; }

      However, if you go with data like this:

      %hoh = ( # actually now a hash of arrays of hashes (HoAoH) user1 => [ { Website => 'website1', type => 'type1',}, { Website => 'website2', type => 'type2',}, { Website => 'website3', type => 'type3',}, ], user2 => [ { Website => 'website1', type => 'type1',}, { Website => 'website2', type => 'type2',}, { Website => 'website3', type => 'type3',}, ], user3 => [ { Website => 'website1', type => 'type1',}, { Website => 'website2', type => 'type2',}, { Website => 'website3', type => 'type3',}, ], );
      Then your code becomes (untested):
      for my $user (sort keys %hoh) { print "$user :\n"; # each element of this array is a hash ref for my $data ( @{ %hoh{$user} } ) { print " $data->{'Website'}\n"; print " $data->{'type'}\n"; } print "\n"; }

      So, depending on what you need to do, pick the data structure that makes your life easier.

        Logs are per line, My hash should look like the second example you have given above. I am getting syntax error for second code.

        I tried the first code given above and it works fine. I am able to get the all websites and categories for each user. Thanks a lot.

        I will now work on getting count for each Website and Type.
        Name: John Website Count google.com 10 yahoo.com 8 facebook.com 5 Type Count Search Engines 10 Entertainment 8 Social Networking 5

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (4)
As of 2024-03-28 20:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found