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"
[email protected] < /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;
and
$_ = $var;
if (/-r/ ) {
$refVal=\$fromUser;
}
Does "if (/-r/ )" means "ignore" all command line that begins with a hyphen
but reference by value the next command line argument after them?
Does $_ contains the following values on each iteration?
mail_smtp.pl
-r
${MAILFROM}
-s
"$subject_line TEST EMAIL"
[email protected]
<
/tmp/test_email.txt
Any "explanation" on this will be very much appreciated. Am going nuts
trying to understand how the iteration functions although am glad it is
functioning.
Thanks in advance.
===============================
mail_smtp.pl source code below:
===============================
#!/usr/bin/perl -w
use Net::SMTP;
use FileHandle;
# global variables
my $fromUser = $ENV{USER};
my @toUser = {};
my $smtpSvr = '192.168.3.11';
my $subject = '';
my $dataFile = '';
#$mailBody = '';
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);
}
}
}
}
# main
getval(@ARGV);
if (@toUser ne {}) {
if ($dataFile eq '') {
$dataFile = '-';
}
open(my $inFile, "< $dataFile");
$smtp = Net::SMTP->new($smtpSvr);
$smtp->mail($fromUser);
$smtp->to(@toUser);
$smtp->data();
$smtp->datasend("From:$fromUser\n");
$smtp->datasend("To:".join(';',@toUser)."\n");
if ($subject ne '') {
$smtp->datasend("Subject:$subject\n");
}
while (<$inFile>) {
if (/^\.$/) {
last;
}
else {
$smtp->datasend($_);
}
}
close($inFile);
$smtp->dataend();
$smtp->quit;
}