Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

Nested Cycle?

by remluvr (Sexton)
on Mar 02, 2012 at 16:14 UTC ( #957507=perlquestion: print w/replies, xml ) Need Help??
remluvr has asked for the wisdom of the Perl Monks concerning the following question:

Hi everyone.
I have another question, it's like I can't actually grasp how to do this task I have. I have a complex structure, like the following:

$VAR1 = { 'name1' => [ 'property1,8.8016', 'property2,4.5016', 'property3,4.0873', 'property4,7.0726', 'property5,9.5121' ], 'name2' => [ 'property6,5.6217', 'property2,4.7993', 'property7,4.2885', 'property3,11.1250', ], 'name3' => [ 'property8,5.6217', 'property2,4.7993', 'property1,4.2885', 'property9,11.1250', ] }

I should choose two words (say, in this case, name1 and name2). I should sum each score of the properties of name1 that are also properties of name2. In the example above, my sum should be the following:
4.5016+4.0873 because this are the values of property2 and property3 in name1 and property2 and property3 are the only 2 properties of name1 that occur in name2.
My problem is, I don't know where to start.
Would you please give me some input to help me, so I can get off this empasse?

Replies are listed 'Best First'.
Re: Nested Cycle?
by JavaFan (Canon) on Mar 02, 2012 at 16:23 UTC
    My problem is, I don't know where to start.
    You could start by changing the structure. You now have a hash, whose values are array(ref)s containing strings you have to split. Turn it into a 2 level hash:
    { name1 => {property1 => 8.8016, property2 => 4.5016, property3 => 4.0873, property4 => 7.0726, property5 => 9.5121,}, name2 => { ... }, name3 => { ... } };
    You can then easily find your answer (untested):
    my $word1 = "..."; my $word2 = "..."; my $data = { ... }; # Contains the data above my $sum = 0; foreach my $property (keys %{$$data {$word1}}) { $sum += $$data{$word1}{$property} if exists $$data{$word2}{$proper +ty}; }
Re: Nested Cycle?
by jethro (Monsignor) on Mar 02, 2012 at 16:26 UTC

    Is this homework for school?

    The most complex part of your problem is: You have two arrays and you want to extract only those properties of the first array that are also in the second array. Write a subroutine that accepts two array references as parameters. In that subroutine loop through the first array and for each property search the second loop (hint: grep() is good for this).

    When you have that subroutine written, the rest is easy: Just write a main routine that gets the two array references and calls the subroutine

Re: Nested Cycle?
by tangent (Priest) on Mar 02, 2012 at 16:44 UTC
    To work with your existing data structure:
    my $name1 = 'name1'; # or whatever my $name2 = 'name2'; # or whatever my $sum = 0; # turn Hash of Arrays into Hash of Hashes my %HOH; while (my($name,$aref) = each %{$VAR1} ) { for my $item (@$aref) { my($prop,$score) = split(',',$item); $HOH{$name}{$prop} = $score || 0; } } my $first = $HOH{$name1}; my $second = $HOH{$name2}; while (my($prop,$score) = each %{$first} ) { $sum += $score if exists $second->{$prop}; } print "Sum of $name1 in $name2 is: $sum\n"; # Prints: Sum of name1 in name2 is: 8.5889
Re: Nested Cycle?
by TJPride (Pilgrim) on Mar 02, 2012 at 17:53 UTC
    use strict; use warnings; my $w1 = 'name1'; my $w2 = 'name2'; my $hash = { 'name1' => [ 'property1,8.8016', 'property2,4.5016', 'property3,4.0873', 'property4,7.0726', 'property5,9.5121' ], 'name2' => [ 'property6,5.6217', 'property2,4.7993', 'property7,4.2885', 'property3,11.1250' ], 'name3' => [ 'property8,5.6217', 'property2,4.7993', 'property1,4.2885', 'property9,11.1250' ] }; my %sums; for (@{$hash->{$w2}}) { @_ = split /,/; $sums{$_[0]} = $_[1]; } for (@{$hash->{$w1}}) { @_ = split /,/; print "$_[0] = $_[1] + $sums{$_[0]} = " . ($_[1] + $sums{$_[0]}) . + "\n" if $sums{$_[0]}; }
Re: Nested Cycle?
by remluvr (Sexton) on Mar 03, 2012 at 09:39 UTC

    Thank you all!

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://957507]
Approved by Corion
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (5)
As of 2017-05-25 04:22 GMT
Find Nodes?
    Voting Booth?