Day 6 - Training
Download
Report
Transcript Day 6 - Training
Perl
Day 6
Multiline Strings
Perl supports a mechanism to deal with multiple
lines of text rather than having to add them one
at a time
Here text (<<)
$LongVar=<<EOF;
This is in the variable now.
So is this.
Woohoo!
EOF
Running other programs
Sometimes in the middle of running one script,
you decide you need to run something else.
Perl gives us the command:
system(“iis reset”);
It executes the command, then continues on
with your program.
If you want it to execute the external command,
then stop your current script:
exec(“iis reset”);
Getting back output
Sometimes there is a built in command
that does everything you want, you just
want to run it, and take it’s output:
@Lines=`netstat –an`;
– This runs “netstat –an”, and puts the output
into an array called Lines.
– Note those are backquotes, not regular
quotes.
Sometimes 1D isn’t enough
Imagine you wanted to keep track of multiple
things about multiple people.
– Ask people 3 questions, and store them in memory
Name
Age
Birthday
You would currently have a hard time storing
that information.
– We could have 3 arrays, @names, @ages, @birthdays
– We’d have to assume that index 0 in each is one person,etc.
What if one person refuses to enter age? Do we put in a 0?
Better solution
I give you multi-dimensional hashes
– $Info{Enda}{Age}=18;
Think of this as a normal hash, that each
value in the hash, happens to be another
hash.
Because of the extra {}’s you shouldn’t
put these directly into strings. Always
include them with a dot (.)
#!/usr/bin/perl
while(1)
{
print("Please enter name [or type quit to end input]\n");
$Name=<STDIN>;
chomp($Name);
if($Name=~/quit/i)
{ last; }
print("Please enter age\n");
$Age=<STDIN>;
print("Please enter birthday\n");
$Birthday=<STDIN>;
}
$Answers{$Name}{Age}=$Age;
$Answers{$Name}{Birthday}=$Birthday;
@Names=keys %Answers;
$AllNames=join(',',@Names);
while(1)
{
print("We got in info from $AllNames. Who would you like to see? [type quit to end]\n");
$ShowName=<STDIN>;
chomp($ShowName);
if($ShowName=~/quit/i)
{ last; }
}
print("$ShowName is ".$Answers{$ShowName}{Age}." years old, and has a birthday on
".$Answers{$ShowName}{Birthday}."\n");
Assigning 1 has to another
If you want the create a hash, then assign the whole thing to a key
in the other, you must assign a REFERENCE to a hash.
– A reference is done by putting a \ before the %hashname
$Hash1{num1}=17;
$Hash1{num2}=30;
$Hash2{num1}=7;
$Hash2{num2}=8;
$Hash3{first}=\%Hash1;
$Hash3{second}=\%Hash2;
$Keys=join(',',keys %Hash3);
print("Hash3 has keys of $Keys\n");
print($Hash3{first}{num2}."\n");
Getting back an entire hash
If you wish to retrieve more than a single key from a hash, you have to indicate what
you are getting back is a hash:
–
Yea, it’s a little weird, the outer %{ } sort of say “treat this as a hash”
$Hash1{num1}=17;
$Hash1{num2}=30;
$Hash2{num1}=7;
$Hash2{num2}=8;
$Hash3{first}=\%Hash1;
$Hash3{second}=\%Hash2;
%ReturnedHash=%{$Hash3{first}};
foreach $Key (keys %ReturnedHash)
{
print("$Key has value $ReturnedHash{$Key}\n");
}
Arrays can be like onions…
Arrays can also have multiple dimensions:
– Think of a classroom, it has rows of students
and columns of students. Lets record all their
names.
$Names[0][0]=“Jeff”;
$Names[0][1]=“Michael”;
$Names[0][2]=“Wes”;
$Names[1][0]=“Drew”;
$Names[1][1]=“Shawn”;
Crossing the streams
You can have arrays of hashes
– $Array[0]=\%Hash1;
– $Array[1]=\%Hash2;
Or hashes of arrays:
– $Data{$Name}=\@DataPoints;
Modules
Another big strength of Perl is that no
matter what you want to do, someone has
probably written a module to make it
easier.
– http://www.cpan.org
– http://search.cpan.org/
Search for smtp
– Net::SMTP
– http://search.cpan.org/~gbarr/libnet-1.22/Net/SMTP.pm
Using a module
If you wish to use an extension module you
simply tell perl to use it:
use Net::SMTP;
Most distributions have the most popular
modules included.
If the module has not been installed on the box,
may have to install
– Active state: open a command prompt and type ppm
– CPAN: perl -MCPAN -e shell
– Or download the module from CPAN and ./configure;
make; make install
Data::Dumper
Earlier we made a hash of hashes, sometimes that gets hard to
visualize:
use Data::Dumper;
print(Dumper(\%Hash3));
That gives us:
$VAR1 = {
'first' => {
'num1' => 17,
'num2' => 30
},
'second' => {
'num1' => 7,
'num2' => 8
}
};
Net::SMTP
I wish to send mail:
use Net::SMTP;
sub SendMessage
{
my ($dstaddress, $message, $subject) = @_;
my $fromuser = “Enda Sullivan <esullivan\@web.com>";
my $smtp = Net::SMTP->new('mailhub.registeredsite.com');
$smtp->mail(‘[email protected]');
$smtp->to($dstaddress);
}
$smtp->data();
$smtp->datasend("From: $fromuser\n");
$smtp->datasend("To: $dstaddress\n");
$smtp->datasend("Subject: $subject\n");
$smtp->datasend("Mime-Version: 1.0\n");
$smtp->datasend("Content-type: text/html; charset=\"iso-8859-1\"\n");
$smtp->datasend("$message\n");
$smtp->dataend();
$smtp->quit;
DBI
Sometimes you want to connect to a database in
Perl
$dbh = DBI->connect("DBI:mysql:database=migration;host=1.2.3.4",“user",“password");
This makes the connection and give you a variable
called $dbh which is the connection.
– Now you can do many things, but the most common are:
$Query=$dbh->selectall_arrayref("select * from table where column=‘hello'");
That gives you a variable $Query, which is a 2D array of fields
from the DB.
$dbh->do(“insert into table values (‘1’,’bob’)”);
That allows you to run queries which don’t produce results.
#!/usr/bin/perl
use DBI;
$dbh = DBI->connect("DBI:mysql:database=migration;host=127.0.0.1","mhsignup",“passwd");
$Result=$dbh->selectall_arrayref(“select dbname,server from Durbo_SQL_Migrations");
foreach $Row (@{$Result})
{
$DB=${$Row}[0];
$Server=${$Row}[1];
}
print("Server: $Server, DB: $DB\n");
CGI
Perl can also be used as a replacement for
CGI language (replacement for php)
– Not saying it should be, just that it can be.
use CGI;
my $q = CGI->new;
@values = $q->param('form_field');