The use of a hash in this application is positively dangerous unless the elements of the @change array (which become the keys of the hash) can be guaranteed to be unique. E.g.:
>perl -wMstrict -le
"my @change = (1.15, -0.1, 5.4, 1.03, 1.15, -0.241);
my @numberofshares = (9999, 400, 200, 300, 500, 240);
my %hash;
@hash{@change} = @numberofshares;
printf qq{%d keys in hash (oops...) \n}, scalar keys %hash;
my $sum = 0;
while (my($k, $v) = each %hash) {
$sum += $v * $k;
}
print qq{sum == $sum (?)};
"
5 keys in hash (oops...)
sum == 1866.16 (?)
Update: The algorithm can be expressed more concisely with some list-processing functions:
>perl -wMstrict -le
"use List::Util qw(sum);
use List::MoreUtils qw(pairwise);
use vars qw($a $b);
my @change = (1.15, -0.1, 5.4, 1.03, -0.241);
my @numberofshares = ( 100, 400, 200, 300, 240);
my $sum = sum pairwise { $a * $b } @change, @numberofshares;
print qq{sum == $sum};
"
sum == 1406.16
I think it could be expressed yet more concisely in Perl 6, but my 6-fu is not that great. Would it be something like:
my $sum +=<<*<< @change, @numberofshares;
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.