On 8/24/07, Kirk Wythers <[EMAIL PROTECTED]> wrote: snip > This is part of what was confusing me. I didn't see %totals declared > anywhere is the suggestion. snip
Yeah, you can only tell it is a hash because of how it is used. I believe the person who posted the example expected you to know what a hash was and how to declare it. snip > Then, should I be declaring my%totals right up top and treating the > variables like this? > > #! /usr/bin/perl -w > > use strict; > use warnings; > > $, = ' '; # set output field separator > $\ = "\n"; # set output record separator > > my%totals; > > my ( $year, $month, $doy, $tmax, $tmin, $par, $precip, $NH4, $NO3, > $O3, $CO2, $V1, $V2, $V3, $V4 ) = split; > # store totals by month as: > > $totals{$year}{$month}{doy} += $doy; > $totals{$year}{$month}{tmax} += $tmax; > $totals{$year}{$month}{tmin} += $tmin; > $totals{$year}{$month}{par} += $par; > $totals{$year}{$month}{precip} += $precip; > etc.... > > # store the count > $totals{$year}{$month}{count} ++; > > print $year, $totals{$year}{$month}{doy} / $totals{$year}{$month} > {count}, $totals{$year}{$month}{tmax} / $totals{$year}{$month} > {count}, $totals{$year}{$month}{tmin} / $totals{$year}{$month}{count, > etc.... snip Yes, assuming that the += code is inside a loop that reads lines from a file. Also, I am incredibly lazy and the thought of typing all of that code gives me the shivers, so I would say #!/usr/bin/perl use strict; use warnings; my @sum = qw<tmax tmin par precip NH4 NO3 O3 CO2 V1 V2 V3 V4>; my %totals; while (<>) { chomp; my %rec; my ($y, $m, $doy); #put year, month, and doy in $y, $m, and $doy and the rest in %rec ($y, $m, $doy, @[EMAIL PROTECTED]) = split; $totals{$y}{$m}{$_} += $rec{$_} for @sum; $totals{$y}{$m}{count}++; } for my $y (sort keys %totals) { for my $m (sort keys %{$totals{$y}}) { my $rec = $totals{$y}{$m}; my @avg = map { $rec->{$_}/$rec->{count} } @sum; print join("\t", $y, $m, @avg), "\n"; } } If I decided later that some columns should be summed and others averaged then I could change it to #!/usr/bin/perl use strict; use warnings; #fields to sum my @sum = qw<tmax tmin par precip NH4 NO3 O3 CO2 V1 V2 V3 V4>; #fields to average my @avg = qw<tmax tmin par NH4 NO3 O3 CO2 V1 V2 V3 V4>; my %totals; while (<>) { chomp; my %rec; my ($y, $m, $doy); #put year, month, and doy in $y, $m, and $doy and the rest in %rec ($y, $m, $doy, @[EMAIL PROTECTED]) = split; $totals{$y}{$m}{$_} += $rec{$_} for @sum; $totals{$y}{$m}{count}++; } for my $y (sort keys %totals) { for my $m (sort keys %{$totals{$y}}) { my %rec; #make a copy of the data so totals can be used for other things @[EMAIL PROTECTED], 'count'} = @[EMAIL PROTECTED],'count'}; #average only the fields in @avg @[EMAIL PROTECTED] = map { $rec{$_}/$rec{count} } @avg; print join("\t", $y, $m, @[EMAIL PROTECTED]), "\n"; } } -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/