Greetings, esteemed monks!

This is a script that's designed to run in cron that sends an automatic email notifying of help desk tickets that have been open for too long.

I decided to keep the info for the tickets in a hash of arrays of arrays. The top level is by priority, (High/Low/Medium) and each contains an array of help tickets, and each help ticket is itself an array.

When I "push" an help ticket into an array of help tickets in each hash key, for some reason, this array reference is randomly showing up in the other hash keys. There is only one ticket that's been open too long, but the output of Data::Dumper shows the same array reference four times. The code:

#!/usr/bin/perl -w use strict; use warnings; use DBI; use Net::SMTP; use POSIX qw(strftime); use Date::Calc qw(Delta_DHMS); use Text::CSV; use Data::Dumper; $\ = "\n"; ################# ############################################# #ticket_notifier.pl #Purpose: Check Database for open tickets and notify #Help Desk staff of tickets that have been open too long ############################################### #Variables ############### #Captcha variables #Bunch of variable specifying email addresses, database login info, et +c redacted here #these are the thresholds, in hours, for alerts. my %thresholds = ( High => 6, Medium => 24, Low => 48 ); my $now_string = strftime "%Y-%m-%d %H:%M:%S", localtime; my @now_time = split /:|\s|-/, $now_string; #Ha ha! Time for Hash of Arrays! (of arrays) my %notify = ( High => [], Medium => [], Low => [] ); my $ts = strftime "%Y%m%d%H%M%S", localtime; my $backup_dir = '/var/chroot/home/content/12/11107612/html/_db_backup +s'; my $backup_filename = "$backup_dir/HDDBBU_$ts.csv"; my @data_elements = ('request id', 'time_received','name', 'email', 'p +rimary_number', 'alt_number', 'facility_name', 'facility_addr', 'urgency','problem_type','message', 'status', 'cl +osed_note', 'last_update_timestamp'); my $select_stmt = "SELECT * from $dbtbl order by ticket_id"; my $select_sth = $dbh->prepare($select_stmt) || warn "prepare statemen +t failed: $DBI::errstr <br/>"; $select_sth->execute() || warn "execute statement failed: $DBI::errstr + <br/>"; while (my $ref = $select_sth->fetchrow_arrayref()) { #split on colon,space,or dash my @ticket_time = split /:|\s|-/, $ref->[1]; my ($Dd,$Dh,$Dm,$Ds) = Delta_DHMS($ticket_time[0],$ticket_time[1],$ticket_time[2],$ti +cket_time[3],$ticket_time[4],0, $now_time[0],$now_time[1],$now_time[2],$now_time[3] +,$now_time[4],0); #my ($Dd,$Dh,$Dm,$Ds) = Delta_DHMS(@ticket_time,0,@now_time,0); my $delta_hrs = $Dd * 24 + $Dh; if ( $ref->[8] eq 'High' && $delta_hrs >= $thresholds{'High'}){ push @{$notify{'High'}}, $ref; }elsif ( $ref->[8] eq 'Medium' && $delta_hrs >= $thresholds{'Mediu +m'}){ push @{$notify{'Medium'}}, $ref; }elsif( $ref->[8] eq 'Low' && $delta_hrs >= $thresholds{'Low'}){ push @{$notify{'Low'}}, $ref; } #debug/testing statement here. warn "Time elapsed for ticket $ref->[0] of priority $ref->[8] is $ +delta_hrs."; } $select_sth->finish(); foreach my $k (sort keys %notify){ warn "Expired $k priority tickets:\n\r"; $email_text .= "Expired $k priority tickets:\n\r"; foreach my $ticket_ref (@{$notify{$k}}){ my $line = join " -- ", @$ticket_ref; $line = "$line \n\r"; warn $line; $email_text .= "$line\n\r"; } } warn Dumper(%notify); my $smtp = Net::SMTP->new($email_server) || die "Couldn't create new +SMTP object: $!"; $smtp->mail($email_from_address) || die "Couldn't set from address us +ing send: $!"; $smtp->to(@email_to_addresses)|| die "Couldn't set to address: $!"; $smtp->data(); $smtp->datasend("To:",join ';',@email_to_addresses, "\n"); $smtp->datasend("From: $email_from_address\n"); $smtp->datasend("Subject: $email_subject\n"); $smtp->datasend("\n"); # done with header $smtp->datasend("$email_intro\n"); #warn $q->p($html_text); $smtp->datasend($email_text) || die "Couldn't call datasend(): $!"; $smtp->dataend() || die "Couldn't call dataend(): $!"; #warn $q->p("called dataend"); $smtp->quit || die "Couldn't call quit()"; #part where we back up the db: my $csv = Text::CSV->new( { binary => 1, eol => "\015\012" } ); #re-use $select_sth $select_sth = $dbh->prepare($select_stmt) || warn "prepare statement f +ailed: $DBI::errstr <br/>"; $select_sth->execute() || warn "execute statement failed: $DBI::errstr + <br/>"; open (my $fh, ">", $backup_filename); #warn a header row to the CSV-- $csv->print($fh, \@data_elements) || warn "Can't print: $!"; while ( my $ref = $select_sth->fetchrow_arrayref() ) { #the csv print function needs a filehandle soo....STDOUT? $csv->print($fh, $ref) || warn "Can't print: $!"; } $select_sth->finish();
Output from Data::Dumper:
$VAR1 = 'Low'; $VAR2 = [ [ '4', '2013-06-15 05:09:16', 'All That Jibber Jabber', 'Jabba@thehut.com', '501-239-0234', '%04 is the ar', 'Tatooine Salvage and Title', '0', 'High', 'training_registratio', 'Hi I\'d like to register for the July 19th webinar', 'closed', 'This fat guy just wants a pretty young thing to be his pr +ey. We\'re not going to give it to him.', '2013-06-15 05:10:39' ] ]; $VAR3 = 'High'; $VAR4 = [ $VAR2->[0], $VAR2->[0] ]; $VAR5 = 'Medium'; $VAR6 = [ $VAR2->[0] ];
Can anyone offer any insight? Thanks.

In reply to Help with HoAoA by OfficeLinebacker

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.