Thanks for everyone who made recommendations and tried to help, I tried the various suggestions and I still get the same results. Maybe I should have included more example code to show how I built the initial arrayreference. So here goes.
The idea behind this is my website www.securitysaint.com which monitors other websites. Each week I want to generate a report and send it to the users. #!/usr/local/bin/perl -w use strict; use DBI; use Mail::Mailer qw(qmail); my $dbh = DBI->connect("DBI:mysql:database=saint;host=localhost","username","password" , {'RaiseError' => 1}); my $current_date = getdate(); print "$current_date\n"; my $url_id_list = get_url_id_list(); foreach my $url_id(@$url_id_list) { $url_id = @$url_id[0]; my $config_details = get_config_details($url_id); my $chk_freq = @$config_details[0]->[0]; my $url_timeout = @$config_details[0]->[1]; my $url = @$config_details[0]->[2]; my $url_protocol = @$config_details[0]->[3]; my $mc_email = @$config_details[0]->[4]; my $full_detail = get_full_detail($url_id); #foreach my $full_detail(@$full_detail) { # Just testing here to make sure it's the real thing and it is # print "@$full_detail[0],@$full_detail[1],@$full_detail[2],@$full_detail[3]\n"; #} my $i; my @day; for($i = 1; $i <= 7; $i++) { $day[$i] = getdate($i); } my $durations = get_durations(\@day); my $avg_resp_time = get_avg_resp_time($durations, $url_id); # foreach my $avg_resp(@$avg_resp_time) { # Just testing here again to make sure it's the real thing # print "AVG = $avg_resp\n"; # } my $sum_errors = get_sum_errors($durations, $url_id); # foreach my $sum_error(@$sum_errors) { # Just testing here again, I am compulsive # print "ERROR COUNT = $sum_error\n"; # } my $sum_checks = get_sum_checks($durations, $url_id); # foreach my $sum_check(@$sum_checks) { #Just testing again, ok so I have a problem with testing things # print "SUM CHECK = $sum_check\n"; # } my $pct_up_time = get_pct_up_time($sum_checks, $sum_errors); # foreach my $pct_up_time(@$pct_up_time) { # Last test, before I seek 12-step help # print "% Uptime = $pct_up_time\n"; # } print "------------\n"; my $email_vars = { chk_freq => $chk_freq, url_timeout => $url_timeout, url => $url, url_protocol => $url_protocol, mc_email => $mc_email, full_detail => $full_detail, avg_resp_time => [ qw(@$avg_resp_time[0] @$avg_resp_time[1] @$avg_resp_time[2] @$avg_resp_time[3] @$avg_resp_time[4] @$avg_resp_time[5] @$avg_resp_time[6]) ], sum_errors => $sum_errors, pct_up_time => $pct_up_time, }; # Below is just some testing to make sure I am getting the variables I think I am before parsing w/HTML::Template # Ok I relapsed and tested again. print "DEBUG TEST @$avg_resp_time[0]\n"; print "URL: $email_vars->{url_protocol}://$email_vars->{url}\n"; print "CHK FREQ: $email_vars->{chk_freq}\n"; print "TIMEOUT: $email_vars->{url_timeout}\n"; print "EMAIL: $email_vars->{mc_email}\n"; print "AVG RESP:\n"; print "DAY1: $email_vars->{avg_resp_time}[0]\n"; # End of test } exit(); sub getdate($days) { my $days = $_[0]; if(! $days) { $days = 0; }; my ($day, $month, $year) = (localtime (time - $days * 86400))[3,4,5]; my $date = sprintf("%04d-%02d-%02d", $year+1900, $month+1, $day); return($date); } sub get_url_id_list { my $select_query = "SELECT url_id FROM monitor_check WHERE active = 1"; my $url_id_list = $dbh->selectall_arrayref($select_query) or die "Can't execute statement: $DBI::errstr"; return($url_id_list); } sub get_config_details($url_id) { my $url_id = $_[0]; my $select_query = "SELECT monitor_check.chk_freq, monitor_check.url_timeout, monitor_url.url, monitor_url.url_protocol, monitor_customers.mc_email FROM monitor_url LEFT OUTER JOIN monitor_customers ON monitor_url.mc_id = monitor_customers.mc_primary_key LEFT OUTER JOIN monitor_check ON monitor_url.url_id = monitor_check.url_id WHERE monitor_url.url_id = ?"; my $config_details = $dbh->selectall_arrayref($select_query, undef, $url_id) or die "Can't execute statement: $DBI::errstr"; return($config_details); } sub get_full_detail($url_id) { my $url_id = $_[0]; my $select_query = "SELECT monitor_report.toc_epoch, monitor_report.chk_status, monitor_report.resp_sec, monitor_response_codes.mnemonic FROM monitor_report LEFT JOIN monitor_response_codes ON monitor_report.chk_status = monitor_response_codes.code WHERE TO_DAYS(NOW()) - TO_DAYS(monitor_report.toc_epoch) <= 7 AND monitor_report.url_id = ?"; my $full_detail = $dbh->selectall_arrayref($select_query, undef, $url_id) or die "Can't execute statement: $DBI::errstr"; return($full_detail); } sub get_durations($days) { my $day_array = $_[0]; my $now = $current_date; my $day1 = @$day_array[1]; my $day2 = @$day_array[2]; my $day3 = @$day_array[3]; my $day4 = @$day_array[4]; my $day5 = @$day_array[5]; my $day6 = @$day_array[6]; my $day7 = @$day_array[7]; my @durations = ( [$now, $day1], [$day1, $day2], [$day2, $day3], [$day3, $day4], [$day4, $day5], [$day5, $day6], [$day6, $day7] ); return(\@durations); } sub get_avg_resp_time($durations,$url_id) { my $durations = $_[0]; my $url_id = $_[1]; my @avg_resp_time; foreach my $duration(@$durations) { my @bind_values = (@$duration[1], @$duration[0], $url_id); my $select_query = "SELECT AVG(monitor_report.resp_sec) FROM monitor_report WHERE monitor_report.toc_epoch between ? AND ? AND monitor_report.url_id = ?"; my $avg_resp_time = $dbh->selectrow_arrayref($select_query, undef, @bind_values) or die "Can't execute statement: $DBI::errstr"; push(@avg_resp_time, @$avg_resp_time); } return(\@avg_resp_time); } sub get_sum_errors($durations, $url_id) { my $durations = $_[0]; my $url_id = $_[1]; my @sum_errors; foreach my $duration(@$durations) { my @bind_values = (@$duration[1], @$duration[0], $url_id); my $select_query = "SELECT COUNT(*) FROM monitor_report WHERE (monitor_report.toc_epoch between ? AND ? AND monitor_report.url_id = ?) AND chk_status > 202"; my $sum_error = $dbh->selectrow_arrayref($select_query, undef, @bind_values) or die "Can't execute statement: $DBI::errstr"; push(@sum_errors, @$sum_error); } return(\@sum_errors); } sub get_sum_checks($durations, $url_id) { my $durations = $_[0]; my $url_id = $_[1]; my @sum_checks; foreach my $duration(@$durations) { my @bind_values = (@$duration[1], @$duration[0], $url_id); my $select_query = "SELECT COUNT(*) FROM monitor_report WHERE (monitor_report.toc_epoch between ? AND ? AND monitor_report.url_id = ?)"; my $sum_check = $dbh->selectrow_arrayref($select_query, undef, @bind_values) or die "Can't execute statement: $DBI::errstr"; push(@sum_checks, @$sum_check); } return(\@sum_checks); } sub get_pct_up_time($sum_checks, $sum_errors) { my $sum_checks = $_[0]; my $sum_errors = $_[1]; my @pct_up_time; for(my $i = 0; $i <= 6; $i++) { if(@$sum_checks[$i] == 0) {next;}; my $sum_good = @$sum_checks[$i] - @$sum_errors[$i]; $pct_up_time[$i] = (($sum_good * 100) / @$sum_checks[$i]); } return(\@pct_up_time); } ----- Original Message ----- From: "Timothy Johnson" <[EMAIL PROTECTED]> To: "'Zachary Buckholz'" <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> Sent: Wednesday, July 10, 2002 1:28 AM Subject: RE: help dereferencing arrayref so I can put the value into a hash > > First of all, don't forget to 'use strict;' at the top of your script. > > But here's a couple of scenarios. The last two are what you are looking > for. Always remember to put curly braces around the reference when you are > dereferencing, and you won't run into this problem. Below are some common > scenarios that people put to Perl, and what it sees. Hopefully it helps you > to see why your original attempts were incorrect. > > ########################################### > > You type: > "@$avg_resp_time[0]" or "@{$avg_resp_time[0]}" > Perl sees: > @avg_resp_time is an array, whose first element is an array reference. > Dereference it. > > You type: > @$avg_resp_time->[0] > Perl sees: > $avg_resp_time is an array reference. Dereference it and find the first > element, which is also an array reference. Dereference it. > > You type: > @{$avg_resp_time}[0] > Perl sees: > $avg_resp_time is an array reference. Dereference it, and then get a hash > slice that has only the first element. > > You type: > ${$avg_resp_time}[0] > Perl sees: > $avg_resp_time is an array reference. Get the first element of the > dereferenced array. > > You type: > $avg_resp_time->[0] > Perl sees: > $avg_resp_time is an array reference. Get the first element of the > dereferenced array. > > ############################################## > > -----Original Message----- > From: Zachary Buckholz [mailto:[EMAIL PROTECTED]] > Sent: Tuesday, July 09, 2002 11:31 PM > To: [EMAIL PROTECTED] > Subject: help dereferencing arrayref so I can put the value into a hash > > > I understand how to use a foreach on a reference to an array as follows: > > my $avg_resp_time = get_avg_resp_time($durations, $url_id); > foreach my $avg_resp(@$avg_resp_time) { > print "AVG = $avg_resp\n"; > } > > But how do I directly access one array value from the reference to the > array? > > print "DEBUG TEST @$avg_resp_time[0]\n"; Fails > print "DEBUG TEST @$avg_resp_time->[0]\n"; Fails > print "DEBUG TEST @{$avg_resp_time[0]}\n"; Fails > > > I have bookmarked ch04_07.htm of the Perl CD "Data Structure Code Examples" > but I just don't understand it. > > I am trying to setup a hash for use in HTML::Template as follows > > my $email_vars = { chk_freq => $chk_freq, > url_timeout => $url_timeout, > url => $url, > url_protocol => $url_protocol, > mc_email => $mc_email, > full_detail => $full_detail, > avg_resp_time => [ qw(@$avg_resp_time[0] > @$avg_resp_time[1] > @$avg_resp_time[2] > @$avg_resp_time[3] > @$avg_resp_time[4] > @$avg_resp_time[5] > @$avg_resp_time[6]) ], > sum_errors => $sum_errors, > pct_up_time => $pct_up_time, > } > Thanks > zack > > > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]