> On Sep 9, 2016, at 8:54 AM, Nathalie Conte <[email protected]> wrote:
>
> Hello,
> I have a question about making a calculation within a loop
>
> I have a hash of hashes
> ##############
> #!/usr/bin/perl
> use strict;
> use warnings;
>
> use Data::Dumper qw(Dumper);
>
> my %grades;
> $grades{"Foo "}{1} = 97;
> $grades{"Foo "}{2} = 107;
> $grades{"Peti "}{1} = 88;
> $grades{"Peti "}{3} = 89;
> $grades{"Peti "}{4} = 99;
>
> print Dumper \%grades;
> print "----------------\n";
>
> foreach my $name ( keys %grades) {
> foreach my $subject (sort {$a <=> $b} keys %{ $grades{$name} }) {
> print "$name, $subject: $grades{$name}{$subject}\n";
> }
> }
>
> ##############
> output is
> $VAR1 = {
> 'Peti ' => {
> '4' => 99,
> '1' => 88,
> '3' => 89
> },
> 'Foo ' => {
> '1' => 97,
> '2' => 107
> }
> };
> ----------------
> Peti , 1: 88
> Peti , 3: 89
> Peti , 4: 99
> Foo , 1: 97
> Foo , 2: 107
> ###############
> Now, what I would like to achieve:
> I want to make a calculation, in each $name (Peti and Foo), calculate:
> for Peti:
> first line : no action
> second line -(minus) 1st line:
> print subject 3-1=2, 89-88=1
> third line - 2nd line:
> print subject 4-3=1, 99-89=10
>
> for foo:
> first line : no action
> second line -(minus) 1st line:
> print subject 2-1=2, 107-97=10
>
For each $name, declare two variables ($prev_subject and $prev_grade below) to
hold the subject and grade. These variables will be undefined during the first
pass through the inner loop:
for my $name ( keys %grades ) {
my $nameref = $grades{$name}; # do one hash lookup
my( $prev_subject, $prev_grade );
for my $subject ( sort keys %{$nameref} ) { # {$a<=>$b} is the default for
sort
my $grade = $nameref->{$subject};
if( defined $prev_subject ) {
my $subject_delta = $subject = $prev_subject;
my $grade_delta = $grade - $prev_grade;
print "$name: $subject_delta: $grade_delta\n";
}
$prev_subject = $subject;
$prev_grade = $grade;
}
}
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/