On 7/21/10 Wed  Jul 21, 2010  10:17 AM, "newbie01 perl"
<newbie01.p...@gmail.com> scribbled:

> Hi all especially Perl teachers if anyone is ... :-)
> 
> I just want to know if someone can provide some explanation on how does the
> argument iterator sub-routine below work. The Perl script is called from a
> UNIX Korn script as below:
> 
> mail_smtp.pl -r ${MAILFROM} -s "$subject_line TEST EMAIL"
> supportm...@test.com < /tmp/test_email.txt
> 
> The Perl script is working and SMTP mail is working. Am just trying to
> understand how the getval sub-routine is parsing the command line arguments.
> the getval subroutine is as below.
> 
> =================================================================
> 
> sub getval {
>         my $refVal = '';
>         foreach $var(@ARGV) {
>                 if ($refVal ne '') {
>                         $$refVal = $var;
>                         $refVal = '';
>                 }
>                 else {
>                         $_ = $var;
>                         if (/-r/ ) {
>                                 $refVal=\$fromUser;
>                         }
>                         elsif (/-f/) {
>                                 $refVal=\$dataFile;
>                         }
>                         elsif (/-s/) {
>                                 $refVal=\$subject;
>                         }
>                         else {
>                                 @toUser = split(/[\;,]/,$var);
>                         }
> 
>                 }
>         }
> }
> 
> =================================================================
> 
> The portion that am confused at is at the following lines:
> 
> $$refVal = $var;

That line assigns (copies) the contents of the $var variable to the location
referenced by the $refVal pointer. This will be either $fromUser, $dataFile,
or $subject, depending upon the option entered (-r, -f, or -s,
respectively).

> 
> and
> 
> $_ = $var;
> if (/-r/ ) {
>         $refVal=\$fromUser;
> }

The above lines copy the contents of $var to $_, tests if $_ contains the
string '-r', and, if it does, sets $refVal to 'refer' to $fromUser.

A better form would be to test $var directly:

if( $var =~ /-r/ ) {
  $refVal = \$fromUser;
}

> Does $_ contains the following values on each iteration?

$var, and hence $_ (since it is a copy of $var), will contain the elements
of the @ARGV array, one per iteration of the foreach loop.

If you use the GetOptions module, you can replace the getval subroutine with
something like this (untested):

use Getopt::Long;

GetOptions(
    'r=s' => \$fromUser,
    'f=s' => \$dataFile,
    's=s' => \$subject
);
push(@toUser, split/[;,]/) for @ARGV;



-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to