Akhenaton has asked for the wisdom of the Perl Monks concerning the following question:

Hey Monks :) I am having a problem with a sub I wrote, which sets up some configs for a mod I found to facilitate an on call pager rotation and I am also using use strict; use warnings; use Date::Manip; use Schedule::Oncall; use Mail::Sendmail; The main issue is I am trying to use some
sub manually_page { system("/bin/bash -c clear"); my $wnum = &UnixDate( "today", "%U" ); # defines the week number f +or the current week 1 - 53 my $sched = new Schedule::Oncall; #open(SESAME, "sbur.sched.$wunm"); if ( defined(open(SESAME, "sbur.sched.$wnum")) ) { my @sched = $sched->load ("file" => "sbur.sched.$wnum"); my $oncall = $sched->oncall (time); my %info = $sched->info ("$oncall"); my $person = $sched->oncall (time); my $pemail = $info{pager}->[0]; # assigned oncall pager email my $fname = $info{fullname}->[0,1]; # assigns the full name of + who's oncall my $emailaddy = $info{email}->[0]; # assigns the email of who' +s oncall } else { print "There isn't a sched file defined!\n"; } my %mail = ( To => "$fname <$emailaddy>", From => 'oncall script <oncall.pl@dcx.com>', Subject => 'Test message yepper', 'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION +", );
In the %mail hash, I am trying to use the above defined vars $fname and $emailaddy - however I am getting the following error:
Global symbol "$fname" requires explicit package name at ./oncall.pl l +ine 69. Global symbol "$emailaddy" requires explicit package name at ./oncall. +pl line 69
I bet it's simple, but being new, I am having a hard time figuring it out, I greatly appreciate any help. -Akhenaton

Replies are listed 'Best First'.
Re: hash question
by Roy Johnson (Monsignor) on Jun 29, 2006 at 14:26 UTC
    The scope of your my declarations is just the if-block. You need to declare them outside of it:
    my $sched = new Schedule::Oncall; # Declare here: my (@sched, $oncall, %info, $person, $pemail, $fname, $emailaddy); #open(SESAME, "sbur.sched.$wunm"); if ( defined(open(SESAME, "sbur.sched.$wnum")) ) { # Don't declare them here, just use them: @sched = $sched->load ("file" => "sbur.sched.$wnum"); $oncall = $sched->oncall (time); %info = $sched->info ("$oncall"); $person = $sched->oncall (time); $pemail = $info{pager}->[0]; # assigned oncall pager email $fname = $info{fullname}->[0,1]; # assigns the full name of wh +o's oncall $emailaddy = $info{email}->[0]; # assigns the email of who's o +ncall } else { print "There isn't a sched file defined!\n"; } my %mail = ( To => "$fname <$emailaddy>", From => 'oncall script <oncall.pl@dcx.com>', Subject => 'Test message yepper', 'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION +", );

    Caution: Contents may have been coded under pressure.
      That's no good, since $emailaddy is undefined. Fix:
      sub manually_page { system("/bin/bash -c clear"); # defines the week number for the current week 1 - 53 my $wnum = &UnixDate( "today", "%U" ); my $sched = new Schedule::Oncall; open(my $sesame_fh, "sbur.sched.$wnum") or die("Unable to open sched file: $!\n"); my @sched = $sched->load("file" => "sbur.sched.$wnum"); my $oncall = $sched->oncall(time); my %info = $sched->info("$oncall"); my $person = $sched->oncall(time); my $pemail = $info{pager}->[0]; # assigned oncall pager em +ail my $fname = $info{fullname}->[0,1]; # assigns the full name of + who's oncall my $emailaddy = $info{email}->[0]; # assigns the email of who +'s oncall my %mail = ( To => "$fname <$emailaddy>", From => 'oncall script <oncall.pl@dcx.com>', Subject => 'Test message yepper', 'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION +", ); ... }

      Why are checking if you can open the file where you do? load should return an error or die.

      Thank you.
Re: hash question
by artist (Parson) on Jun 29, 2006 at 14:26 UTC