Perl: the Markov chain saw PerlMonks

### Re^11: Computing results through Arrays

by aaron_baugher (Curate)
 on Jun 24, 2015 at 10:46 UTC ( #1131783=note: print w/replies, xml ) Need Help??

in reply to Re^10: Computing results through Arrays
in thread Computing results through Arrays

robby_dobby already pointed out the actual mistake: you need to pass fnd_max() a reference to the hash, since that's what fnd_max() is expecting. See how I pass my hashes to set_column widths().

Now beyond that: First, I'd use a more descriptive subroutine name, like "max_value_of_hash", and drop the prototype. Prototypes are advanced juju and shouldn't be used most of the time. Second, if you want to get the largest value from a hash, you don't need to access the keys at all. Here are some examples, starting with the simplest and wordiest:

```#!/usr/bin/env perl
use 5.010; use strict; use warnings;

# newbie but clean version
sub max_value_of_hash {
my \$h = shift;
my \$max = 0;
for my \$v (values %\$h){
if (\$v > \$max){
\$max = \$v;      # keep setting \$max to larger value
}
}
return \$max;
}

# more perlish and elegant version
sub max_value_of_hash2 {
my \$h = shift;
my \$max = 0;
\$_ > \$max ? \$max = \$_ : undef for values %\$h;
return \$max;
}

# let a module do it
sub max_value_of_hash3 {
use List::Util qw(max);
return max values %{\$_[0]};
}

my %hash = ( a => 1, b => 2, c => 5, d => 3 );
say max_value_of_hash( \%hash);
say max_value_of_hash2(\%hash);
say max_value_of_hash3(\%hash);

Aaron B.
Available for small or large Perl jobs and *nix system administration; see my home node.

Replies are listed 'Best First'.
Re^12: Computing results through Arrays
by yasser8@gmail.com (Novice) on Jun 24, 2015 at 13:01 UTC

Sorry I was not clear with my requirement, also I made worst mistake in my code.

My requirement is to print the Maximum value the same way Average value printing works. So the assignment of values to hash array keys should be max value instead of sum of the values in that group.

```while(<DATA>){
next unless /\w/;
my(\$server,\$datetime,\$database,\$speed) = (split)[0,1,2,3];
my \$ddhhmm = substr \$datetime,0,16;
my \$ddhh   = substr \$datetime,0,13;
\$h{\$ddhh  }{\$database} += \$speed;
\$m{\$ddhhmm}{\$database} += \$speed;
\$db{\$database} = 1;
\$sr{\$server  } = 1;
}

Is there a way to assign maximum value in this while loop shown above to \$h{\$ddhh }{\$database} and \$m{\$ddhhmm}{\$database} ??

If this is possible then I can follow the same procedure to print Max values the same way we did for Average.

One more doubt... All I did to find Average is to loop through the Hash Array one more time and assign the Average value to it as shown below

```for my \$key (sort keys %h){
for (@db) { \$h{\$key}{\$_} = round(\$h{\$key}{\$_} / (\$count * 60))} ;
}

Can it be done efficiently without looping the Hash Array again ? I mean can this be done in while loop itself ?

I may still not understand exactly what you're trying to do. But if you want to keep track of a max value for each time/database at the same time that you're keeping a total for the purpose of averaging, you could do something like this inside your while() loop:

```\$h{\$ddhh  }{\$database}{total} += \$speed;
\$m{\$ddhhmm}{\$database}{total} += \$speed;
\$h{\$ddhh  }{\$database}{max}    = max((\$h{\$ddmm}{\$database}{max} || 0),
+ \$speed);
\$m{\$ddhhmm}{\$database}{max}    = max((\$h{\$ddmm}{\$database}{max} || 0),
+ \$speed);

You can use the max() function from List::Util or write your own. Now later in the code where you used to access the total speed with \$h{\$timestamp}{\$database}, you'll change that to access it as \$h{\$timestamp}{\$database}{total}. And that makes room to keep track of the maximum value for each one in \$h{\$timestamp}{\$database}{max}. Make sense?

Aaron B.
Available for small or large Perl jobs and *nix system administration; see my home node.

Thanks, this is what exactly I was looking out for. Once again thanks a lot.

Create A New User
Node Status?
node history
Node Type: note [id://1131783]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (7)
As of 2020-06-04 18:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Do you really want to know if there is extraterrestrial life?

Results (35 votes). Check out past polls.

Notices?