Perl
Sissejuhatus
Perl (Practical Extraction and Report Language, praktiline väljavõtete ja raportite koostamise keel) http://www.perl.org/ on suhteliselt populaarne programmeerimiskeel, mille lõi Larry Wall http://en.wikipedia.org/wiki/Larry_Wall 1987 aastal ja millele peetakse iseloomulikuks
- kasutamise lihtsus, st kiiresti õpitav ja saab kiiresti jõuda kasutatavate tulemusteni
- keele küpsus
- sobib mitmekesiste ülesannete lahendamiseks, eriti tekstitöötlus (ingl. k. general purpose language)
- Perl on skriptimiskeel (ingl. k. scripted language) st programmid on koheselt käivitatavad ja ei vaja kompileerimist
- Perl on vaba tarkvara
- 8-bit clean
2010 aastal on levinud kasutada Perl v. 5.x, Perl v. 6 arendus toimub.
Mõned populaarsed vaba tarkvaralised Perli rakendused on näiteks
- Sympa - postiloendi server (ingl. k. listserver) tarkvara
- OTRS - probleemihalduse süsteem
- SpamAssassin - eposti spami analüüsivahend
- Bugzilla - veahaldussüsteem
Lisaks kasutatakse Perli ohtrasti kommertstarkvara koosseisus, nt Oracle ja VMware.
Perli paigaldamine
Debian Lenny paketihaldus sisaldab Perl v. 5.10 tarkvara. Kasutaja saab Debiani pakettidest Perli baasfunktsionaalsusele juurde lisada spetsiaalseid võimalusi, nt andmebaasi kasutamiseks või HTTP päringute tegemiseks. Reeglina esinevad Perli moodulite pakettide nimed kujul libXXX-perl või libXXX-YYY-perl, nt
- libdbd-pg-perl - PostgreSQL andmebaasi kasutamiseks vajalik pakett
- libwww-perl - HTTP päringute kasutamiseks vajalik pakett
Lähteteksti kujul jagatavad Perli teegid on kogutud CPAN (Comprehensive Perl Archive Network) arhiivi aadressile http://www.cpan.org/. CPAN kasutamisel peab kasutaja ise jälgima, mida ta sealt kasutab, tundub, et seal on väga erineva kvaliteediga tarkvara.
Programmeerimine Perlis
Perli kasutamist iseloomustab hulga slooganeid, nt mõned
- Easy things should be easy, and hard things should be possible (ingl. k. lihtsad asjad peaksid olema lihtsad ja keerulised asjad võimalikud)
- There's more than one way to do it (ingl. k. on enam kui üks viis midagi teha)
Viimane vastandub Pythonile, kus on põhimõtteks, et millegi sooritamiseks on üks oluliselt õigem viis kui mõned muud võimalikud variandid. Osalt on tingitud Perli ja Pythoni nö paradigma erinevus asjaolust, et Perli autor on taustalt keeleteadlane, kusjuures Pyhtoni autor matemaatik.
Perliga kaasneb hulgaliselt dokumentatsiooni, alustada on sobiv öeldes
$ man perlintro
- Perl on free-form keel, mis tähendab, et kõikjal kus on lubatud kasutada tühikut/tabulaatorit/reavahetust võib kasutada neid üksteise asemel ja meelepärases koguses
- Perli skripti käivitamisel esmalt programm kompileeritakse nn baitkoodiks (bytecode), seejärel Perli bytecode engine käivitab baitkoodile vastava programmi; Perl 5 puhul kasutaja üldiselt ei saa baitkoodis tulemust salvestada ja otseselt edaspidi käivitada
Perli skript
Perli saab käivitada otse käsurealt, nt selliselt
$ perl -e 'print "Hello World!\n";' Hello World!
Perli skript esineb tekstifaili kujul, selline skript kirjutab välja arvud ühest kolmeni
for (1..3) { print "$_\n"; }
kus
- TODO
Skripti käivitamiseks sobib öelda
$ perl skript.pl 1 2 3
Alternatiiviks on lisada faili algusse rida interpretaatori nimega
#!/usr/bin/perl for (1..3) { print "$_\n"; }
ning muuta fail käivitatavaks
$ chmod 0755 skript.pl
ning käivitada
$ ./skript.pl
Lisaks töötavatele ridadele võib skriptis esineda kommentaare, kõike # märgist paremale jäävat käsitletakse kommentaarina.
Sõne-operatsioonid
Sõnedega (ingl. k. string) saab teha nt selliseid operatsioone
- omistada muutujale ja esitada
$linn = "Tartu"; print $linn;
- liita punkti abil
$linn = "Tartu"; print "Asukoht " . $linn;
Andmestruktuurid
Muutujaid võib liigitada mitmel alusel, nt
- skoobi järgi, kus nad omavad väärtusi
- sisu järgi, nt tekstilised või arvulised
- struktuuri järgi, nt kas nad vastvad nö ainsuses (ingl. k. singular) või mitmuses (ingl. k. plural) esitatud objektidele
Perli eristatakse muutujaid eelkõige selle järgi, kas tegu on ainsuse mõi mitmusega tegeleva sisuga muutujatega, vastavalt singular ja plural.
Singular
Omakorda singular tüüpi muutujad on kahte sorti, numbrid ja sõned, kusjuures Perl käsitleb neid vastavalt kontekstile, nt
$a = 12; $b = 34; print $a + $b; print $a . $b;
Käivitamisel
$ perl skript.pl 46 1234
esitatakse esimesel juhul aritmeetiline summa kuna kasutakse liitmistehet, teisel juhul aga liidetakse omavahel sõned kuna kasutatakse sõnede kokkuühendamise operaatorit. Kuna Perl on nõrga tüübiskeemiga keel, siis saab nt liita arve ja sõnesid
print "mina tulen kell " . 10 . "\n";
Plural
Massiiv (ingl. k. array) on plural tüüpi muutuja, kusjuures eristatakse kahte tüüpi massiive
- massiiv -
- assotsiatiivne massiiv (ingl. k. associative array) -
Massiiv on järjestatud hulk, nt
@massiiv = ('yks', 'kaks', 'kolm');
kusjuures elemendi poole saab pöörduda tema numbrilise indeksi abil, nt teine element
$massiiv[1];
Sõnastik (ingl. k. associative array) on järjestamata hulk elemente, nt
%sonastik = ("Priit" => 28 ,"Mart" => 19, "Mari" => 18, "Endel" => 65);
kusjuures elemendi poole saab pöörduda võtme abil, nt võtmele "Priit" vastava elemendi väärtuseks on 28
$sonastik{"Priit"};
References
TODO
Failioperatsioonid
Failioperatsioonid tegelevad failist lugemise ja faili kirjutamisega.
Lisaks näidetes toodud pidemetele on olemas sellised võimalused
- open (fh, " | valjnud-programminimi")
- open (fh, "sisend-programminimi |")
Lugemine
Tekstifailist lugemiseks sobib kasutada nt sellist järgnevust
open (fh, 'urlid.txt'); @read=<fh>; foreach $rida(@read) { print $rida; }
kus
- open (fh, 'urlid.txt') - avab tekstifaili
- @read täidab massiivi ridade väärtustega
- foreach-korduse abil esitatakse massiivi elementideks olevad read
Käsurea argumendina esitatud failidest loeb nt selline skript
while (<>) { chomp $_; print $_, "\n"; }
Kasutamiseks sobib öelda
$ perl skript.pl /etc/fstab
Kirjutamine
Faili kirjutamist kirjeldab nt selline programmilõik
@read = ("loomaaed.tartu.ee", "kuutorvaja.eenet.ee"); open (fh, ">urlid.txt"); foreach $rida(@read) { print fh "$rida\n"; }
kus
- @read - massiivi elemendid vastavad ridadele
- open - avab faili urlid.txt kirjutamiseks, kusjuures > tähendab, et igal skripti käivitamisel faili sisu kirjutatakse üle
- foreach korduse abil töötatakse @read massiivi elemendid läbi
- print kirjutab failiga urlid.txt seotud failipidemesse fh, seejuures kasutatakse puhverdamist, st tõenäoliselt kirjutatakse programmi lõpus ühekorraga faili kolm rida
Kui programmi iseloom nõuab, et faili jõuavad andmed programmi töö käigus vastavalt print ütlustele, sobib kasutada sellist konstruktsiooni
@read = ("loomaaed.tartu.ee", "kuutorvaja.eenet.ee"); open (fh, ">urlid.txt"); foreach $rida(@read) { select fh; $|=1; print fh "$rida\n"; }
Tingimused
Perlis saab kasutada nt selliseid selliseid tingimusi arvväärtustega
... $x = 1; if ($x < 0) { print "Alla nulli\n"; } elsif ($x == 0) { print "Null\n"; } elsif ($x == 1) { print "Yks\n"; } else { print "Suurem yhest\n"; }
Perlis saab kasutada nt selliseid selliseid tingimusi sõnedega
... if ($alert eq "tm_public_flows") { print "tm_public_flows"; } elsif ($alert eq "tm_total_flows") print "tm_public_flows"; }
Kordused
for-kordus
for ($i = 1; $i < 4; $i++) { print "$i\n"; }
kus
- for-kordus väärtustab muutuja $i järjest suurenevalt väärtustega 1, 2, 3
- print esitab väärtus ja reavahetuse märgi
- lause lõpetab semikoolon
foreach-kordus
@linnad=("Tartu", "Tallinn", "Voru", "Elva"); foreach $linn(@linnad) { print "$linn\n"; }
kus
- TODO
while-kordus
Tingimust kontrollitakse iga korduse alguses ja kui see on tõene, siis lause täidetakse
$i = 0; while ($i < 3) { print "muutuja i vaartus on: $i\n"; $i=$i+1; }
Funktsioonid
Funktsioonid võimaldavad üldiselt kahte asja
- korraldada programmi osade korduvkasutust
- jagada programmi loogilisteks osadeks
Funktsioon kireldatakse sub direktiivi abil, nt selliselt
sub korrutamine { $result = $_[0] + $_[1]; return $result; }
Toodud funktsiooni sobib välja kutsuda selliselt, kogu programm oleks
sub korrutamine { $result = $_[0] + $_[1]; return $result; } $korrutis = korrutamine(4, 5); print $korrutis, "\n";
Perlis praktiliselt ei eristada funktsioone ja protseduure.
Moodulid
Moodulite abil organiseeritakse programmi teksti kõige üldisemal tasemel ja korraldada programmitekstide korduvkasutust. Perli moodulid esinevad kahel kujul
- traditsiooniline - moodulit kasutav skript impordib moodulis kirjeldatud alamprotseduurid ja muutujad ning kasutab neid
- objektorienteeritud - moodulit kasutav skript kutsub välja kirjeldatud meetodeid
Moodulid asuvad mooduli nimele vastavas kataloogis/failis kusjuures faili nimi lõpeb '.pm', nt
Fyysika/Mehhaanika.pm Matemaatika/Aritmeetika.pm
Otsingutee
Perl otsib mooduleid otsinguteelt, nii saab esitada otsinguteel olevad kataloogid
foreach (@INC) { print $_, "\n"; }
Nt Debian Lenny keskkonnas on otsingutee vaikimisi
$ perl skript.pl /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .
Traditsiooniline moodul
Mooduli kirjeldab selline fail Fyysika/Mehhaanika.pm
package Fyysika::Mehhaanika; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(kiirus); our @EXPORT_OK = qw($aeg); our $VERSION = 1.00; sub kiirus { print "Kiiruspiirang on 60 km/h\n"; } $aeg = 1024; 1;
Kirjeldatud moodulit kasutab selline skript
use Fyysika::Mehhaanika; kiirus();
Objektorienteeritud moodul
Klassi kirjeldab selline fail Matemaatika/Aritmeetika.pm
package Matemaatika::Aritmeetika; sub new { my $class = shift; my $self = {}; bless($self, $class); return $self; } sub liida { my ( $self, $arg1, $arg2) = @_; $summa = $arg1 + $arg2; return "$summa"; } sub korruta { my ( $self, $arg1, $arg2) = @_; $korrutis = $arg1 * $arg2; return "$korrutis"; } 1;
Kirjeldatud klassi meetodeid liida ja korruta saab kasutada nt selliselt
use Matemaatika::Aritmeetika; $arvutaja = Matemaatika::Aritmeetika->new(); print $arvutaja->liida(15, 20), "\n"; print $arvutaja->korruta(5, 2), "\n";
Kasulikud lisamaterjalid
- perldoc perlboot, perltoot, perltooc
- http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perltoot.html
HTTP
LWP teek võimaldab teha Perlist http päringuid, paigaldamiseks sobib öelda
# apt-get install libwww-perl
Kasulikud lisamaterjalid
- dpkg -L libwww-perl
- man LWP
GET päring
GET päringu tegemiseks sobib öelda
use LWP; my $browser = LWP::UserAgent->new; my $url = 'http://ftp.auul.pri.ee/README'; my $response = $browser->get( $url ); print $response->content;
Perli CGI skript
Lisaks peab CGI skript rahuldama järgmisi tingimusi: skript peab asuma kataloogistruktuuri html all skript peab kuuluma sellele kasutajale, kelle veebikohale vastavas kataloogistruktuuris ta asub skriptile ei tohi viidata absoluutse (/ee/edu/zoo/www/html/skript.cgi) teega skript peab olema kirjutatav vaid kasutajale endale skriptile peab olema antud käivitamisõigus, näiteks käsuga 'chmod 755 skript.cgi'
Skripti esimesel real tuleb näidata Perli interpretaatori asukoht (/usr/bin/perl). Esimese asjana peab skript väljundisse kirjutama HTTP päise. Kui määratletakse Content-type, näiteks 'text/html', peab sellele järgnema kaks reavahetust.
Näiteks selline Perlis kirjutatud CGI skript trükib brauseris ekraanile 'Tere rahvas!'
#!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML><BODY>"; print "Tere rahvas!"; print "</BODY></HTML>";
Näite vaatamiseks järgige viidet perl.cgi
Kui te kasutate CGI skripte veebivormidega tegelemisel, siis on tõenäoliselt neid tarvis töödelda. Selleks soovitame meie serveris, va erilisel vajadusel kasutada Perli CGI.pm moodulit. Näiteks töötleme CGI.pm mooduli vahenditega järgmist vormi
<HTML> <BODY> <FORM ACTION="plkontroll.cgi" METHOD="POST"> nimi: <INPUT TYPE="text" NAME="nimi" >
linn: <INPUT TYPE="text" NAME="linn" >
koht: <INPUT TYPE="text" NAME="koht" >
<input type="reset" value="Puhasta väljad"> <input type="submit" value="OK"> </FORM> </BODY> </HTML>
Vormis sisalduv ACTION="plkontroll.cgi" kutsub välja sellise CGI skripti plkontroll.cgi
#!/usr/bin/perl use CGI; $q = new CGI; # # tekitatakse HTTP päis, # see on ekvivalentne käsuga # print "Content-type: text/html\n\n"; # print $q->header('text/html'); # # tekitatakse HTML-dokumendi algus, # see on ekvivalentne käsuga # print "<HTML><HEAD><TITLE>Dokumendi tiitel</TITLE></HEAD><BODY>"; # print $q->start_html('Dokumendi tiitel'); print "Vormilt saadi järgmised väärtused:
"; print "nimi:", $q->param('nimi'), "
"; print "linn:", $q->param('linn'), "
"; print "koht:", $q->param('koht'), "
"; # # väljastatakse HTML-dokumendi lõpp, # see on ekvivalentne käsuga # print "</BODY></HTML>"; # print $q->end_html;
POST päringu teenindamine kliendi võrguühenduse kiiruse mõõtmiseks
- veebiserveri ettevalmistamine
- file upload teenindamise skripti ettevalmistamine
PostgreSQL andmebaasi kasutamine
DBD::Pg http://search.cpan.org/dist/DBD-Pg võimaldab Perlist kasutada PostgreSQL andmebaasi. Tarkvara paigaldamiseks Debian operatsioonisüsteemis sobib öelda
# apt-get install libdbd-pg-perl
Kasulikud lisamaterjalid
- man DBD::Pg
Andmete lugemine
Skript küsib andmebaasi tabelist priit.priidutabel kahte väärtust
use DBI; $dbh = DBI->connect("dbi:Pg:dbname=baasinimi;host=192.168.10.205;port=5432", 'kasutajanimi', 'parool', {AutoCommit => 0}); $sth = $dbh->prepare( "SELECT nimi, vanus FROM priit.priidutabel where nimi = 'Priit Kask'"); $sth->execute; while ( ($nimi, $vanus) = $sth->fetchrow()){ print "nimi: $nimi, vanus: $vanus\n"; }
kus
- DBI->connect moodustab andmebaasiga ühenduse
- $dbh->prepare valmistab ette päringu
- $sth->execute esitab päringu
- $sth->fetchrow() tagastab vastused rea kaupa
- while-kordus esitab vastuse rea kaupa kuni ridu on
Andmete sisestamine
Andmete baasi sisestamisel tuleb lisaks öelda commit
use DBI; $dbh = DBI->connect("dbi:Pg:dbname=baasinimi;host=192.168.10.205;port=5432", 'kasutajanimi', 'parool', {AutoCommit => 0}); $sth = $dbh->prepare( "insert into priit.priidutabel (nimi, vanus) values ('Marta', 54)"); $sth->execute; $dbh->commit();
MySQL andmebaasi kasutamine
DBD::mysql http://search.cpan.org/dist/DBD-mysql/ võimaldab Perlist kasutada MySQL andmebaasi. Tarkvara paigaldamiseks Debian operatsioonisüsteemi sobib öelda
# apt-get install libdbd-mysql-perl
Kasulikud lisamaterjalid
- man DBD::mysql
Andmete lugemine
Skript küsib andmebaasi tabelist priidutabel kahte väärtust
use DBI; $dbh = DBI->connect("dbi:mysql:dbname=baasinimi;host=192.168.1.247;port=3306", 'kasutajanimi',\ 'parool', {AutoCommit => 0}); $sth = $dbh->prepare( "SELECT nimi, vanus FROM priidutabel where nimi='Priit Kask'"); $sth->execute; while ( ($nimi, $vanus) = $sth->fetchrow()){ print "nimi: $nimi, vanus: $vanus\n"; }
kus
- DBI->connect moodustab andmebaasiga ühenduse
- $dbh->prepare valmistab ette päringu
- $sth->execute esitab päringu
- $sth->fetchrow() tagastab vastused rea kaupa
- while-kordus esitab vastuse rea kaupa kuni ridu on
Andmete sisestamine
Andmete baasi sisestamisel tuleb lisaks öelda commit
use DBI; $dbh = DBI->connect("dbi:mysql:dbname=baasinimi;host=192.168.1.247;port=3306", 'kasutajanimi', \ 'parool', {AutoCommit => 0}); $sth = $dbh->prepare( "insert into priidutabel (nimi, vanus) values ('Marta', 'Magnusson')"); $sth->execute; $dbh->commit();
Oracle andmebaasi kasutamine
DBD::Oracle http://search.cpan.org/~pythian/DBD-Oracle/ võimaldab Perlist kasutada MySQL andmebaasi, eelduseks on, et süsteemi on paigaldatud Oracle Instant Client tarkvara
oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.zip oracle-instantclient11.2-sdk-11.2.0.1.0-1.x86_64.zip oracle-instantclient11.2-sqlplus-11.2.0.1.0-1.x86_64.zip
Lisaks peab olema paigaldatud libdbi-perl pakett
# apt-get install libdbi-perl
ning tuleb kompileerida DBD-Oracle tarkvara aadressilt http://search.cpan.org/CPAN/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.24a.tar.gz
# export LD_LIBRARY_PATH=/opt/instantclient # export ORACLE_HOME=/opt/instantclient # export TNS_ADMIN=/opt/instantclient # tar zxf DBD-Oracle-1.24a.tar.gz # cd DBD-Oracle-1.24 # perl Makefile.PL Using DBI 1.605 (for perl 5.010000 on x86_64-linux-gnu-thread-multi) installed in /usr/lib/perl5/auto/DBI/ Configuring DBD::Oracle for perl 5.010000 on linux (x86_64-linux-gnu-thread-multi) Remember to actually *READ* the README file! Especially if you have any problems. Installing on a linux, Ver#2.6 Using Oracle in /opt/instantclient DEFINE _SQLPLUS_RELEASE = "1102000100" (CHAR) Oracle version 11.2.0.1 (11.2) Looks like an Instant Client installation, okay You don't have a libclntsh.so file, only /opt/instantclient/libclntsh.so.11.1 So I'm going to create a /opt/instantclient/libclntsh.so symlink to /opt/instantclient/libclntsh.so.11.1 Your LD_LIBRARY_PATH env var is set to '/opt/instantclient' Oracle sysliblist: Found header files in /opt/instantclient/sdk/include. Checking for functioning wait.ph System: perl5.010000 linux brahms 2.6.30.5-dsa-amd64 #1 smp mon aug 17 02:18:43 cest 2009 x86_64 gnulinux Compiler: cc -O2 -g -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include \ -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 Linker: /usr/bin/ld Sysliblist: Linking with -lclntsh. Checking if your kit is complete... Looks good LD_RUN_PATH=/opt/instantclient Using DBD::Oracle 1.24. Using DBD::Oracle 1.24. Using DBI 1.605 (for perl 5.010000 on x86_64-linux-gnu-thread-multi) installed in /usr/lib/perl5/auto/DBI/ Writing Makefile for DBD::Oracle *** If you have problems... read all the log printed above, and the README and README.help.txt files. (Of course, you have read README by now anyway, haven't you?) # make # make install
Tulemusena paigaldatakse failisüsteemi
/usr/local/lib/perl/5.10.0/auto/DBD/Oracle /usr/local/lib/perl/5.10.0/DBD/Oracle*
Kasulikud lisamaterjalid
- man DBD::Oracle
Nt selline skript kasutab Oracle andmebaasi
use strict; use DBI; $ENV{NLS_LANG}='ESTONIAN_ESTONIA.AL32UTF8'; my $dbh = DBI->connect( 'dbi:Oracle:host=IP.AA.DRE.SS;sid=SID_VAARTUS', 'kasutajanimi', 'parool', { RaiseError => 1, AutoCommit => 0 } ) || die "Database connection not made: $DBI::errstr"; my $sql = qq{ SELECT nimi, vanus from klassifikaator }; my $sth = $dbh->prepare( $sql ); $sth->execute(); my ( $nimi, $vanus ); $sth->bind_columns( undef, \$nimi, \$vanus ); while( $sth->fetch() ) { binmode(STDOUT, ":utf8"); print "$nimi, $vanus\n"; } $sth->finish(); $dbh->disconnect();
kus
- ENV ja binmode on vajalikud UTF-8 kodeeringu korrektseks töötamiseks
Korrektsem oleks kasutada /opt/instantclient/tnsnames.ora sisuga
dbloom = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = db.loom)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = db.loom) ) )
ja skriptis rida
my $dbh = DBI->connect( 'dbi:Oracle:SID_VAARTUS', 'kasutajanimi', 'parool',
SMTP
Email::Sender http://search.cpan.org/dist/Email-Sender/ võimaldab Perlist saata SMTP serveri vahendusel välja kirju. Tarkvara paigaldamiseks sobib öelda
# apt-get install libemail-sender-perl
Nt selline skript saadab välja kirja SMTP serveri vahendusel
use strict; use Email::Sender::Simple qw(sendmail); use Email::Simple; use Email::Simple::Creator; use Email::Sender::Transport::SMTP; my $email = Email::Simple->create( header => [ To => '"Mart Kask body" <mart@loomaaed.tartu.ee>', From => '"Priit Kask body" <priit@loomaaed.tartu.ee>', Subject => "Oluline teade", ], body => "See kiri on saadetud libemail-sender-perl abil.\n", ); my $envelope_from = "mart-envelope\@loomaaed.tartu.ee"; my $envelope_to = "priit-envelope\@loomaaed.tartu.ee"; my $transport = Email::Sender::Transport::SMTP->new({ host => '192.168.1.250', port => 25, }); sendmail($email, { transport => $transport, from => $envelope_from, to => $envelope_to });
kus
- envelope_* - ümbriku aadressid
- body sõne kasutatakse kirja kehas kasutatud aadresside juures
DNS
Net::DNS http://www.net-dns.org/ võimaldab Perlist esitada DNS päringuid. Tarkvara paigaldamiseks tuleb öelda
# apt-get install libnet-dns-perl
Kasulikud lisamaterjalid
- man Net::DNS
Skript esitab domeeninimele vastavate MX kirjete ip aadressid
use Net::DNS; my $res = Net::DNS::Resolver->new; my @mx = mx($res, "loomaaed.tartu.ee"); foreach $rr (@mx) { print $rr->preference, " ", $rr->exchange, "\n"; }
LDAP
Net::LDAP http://ldap.perl.org/ võimaldab Perlist kasutada LDAP kataloogi. Tarkvara paigaldamiseks Debian operatsioonisüsteemis sobib öelda
# apt-get install libnet-ldap-perl
Kasulikud lisamaterjalid
- man Net::LDAP
Skript LDAP kataloogist päringu tegemiseks, esitatakse filtriga klappivate sissekannete cn ja loginShell väärtused
use Net::LDAP; $ldap = Net::LDAP->new('192.168.1.247') or die "$@"; $mesg = $ldap->search( base => "dc=loomaaed,dc=tartu,dc=ee", filter => "uid=mart", ); my $max = $mesg->count; for (my $index = 0 ; $index < $max ; $index++) { my $entry = $mesg->entry($index); print $entry->get_value(('cn')), " ", $entry->get_value(('loginShell')), "\n"; }
Gnuplot kasutamine
Gnuplot http://www.gnuplot.info/ kasutamiseks on Perli moodul Chart::Gnuplot, paigaldamiseks sobib Debian Lenny keskkonnas öelda
# apt-get install libchart-gnuplot-perl
Nt kasutab Chart::Gnuplot moodulit selline skript
#!/usr/bin/perl use utf8; use Encode; use Chart::Gnuplot; my @x = (-10 .. 10); my @y = (0 .. 20); my $chart = Chart::Gnuplot->new(); $chart->command("set zero 1e-20"); $chart->command("set encoding utf8"); # $chart->command("set terminal png font Helvetica"); $chart->set( output => "/tmp/valjund.png", title => { text => "Sample testing tiitel", font => "Helvetica, 26" }, xlabel => "My x-axis label", ylabel => "My y-axis label" ); my $dataSet = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, title => "tiitel2", style => "linespoints" ); $chart->plot2d($dataSet);
kus
- TrueType fontide kasutamiseks tuleb vastavad fondid paigaldada, vaikimisi asuvad nad kataloogis /usr/share/fonts/truetype
# apt-get install ttf-dejavu
- skripti töö tulemusena tekib fail /tmp/valjund.png
Perli manuaalide kasutamine
Reeglina saab Perli moodulite manuaale vaadata kasutade moodulite nimesid, nt
$ man Net::LDAP
Lisaks on olemas perldoc süsteem, paigaldamiseks tuleb öelda
# apt-get install perl-doc
ja kasutamiseks nt
$ perldoc perltoot
Küllaltki levinud on, et Perli moodulid sisaldavad ka asjakohast dokumentatsiooni, kasutamiseks sobib öelda nt
$ perldoc /usr/lib/perl/5.10.1/Sys/Syslog.pm
Programmide käivitamine shellist
Perli skriptis saab kutsuda välja operatsioonisüsteemi shellis antud korraldusi ning seejuures kasutada nende täitmisel antud väljundit, nt
$df=`df`; print $df;
Alamprotsesside loomine
Alamprotsesside loomise (ingl. k. to fork) teel saab käivitada paralleelselt mitmeid protsesse. Alamprotsessi loomisel moodustatakse olemasolevast protsessist koopia, ning edasi töötab arvutis kaks protsessi
- vanem (ingl .k. parent) - protsessi, milles toimus fork funktsiooni väljakutse
- laps (ingl. k. child) - fork tulemusena tekkinud uus protsessi
Põhimõtteliselt töötab alamprotsessi moodustamine selliselt, tulemusena on käivitatud töötavast programmist juurde teine eksemplar
@filesetid = ("bsd", "base46.tgz", "comp46.tgz", "etc46.tgz", "man46.tgz", "misc46.tgz"); foreach $fileset(@filesetid) { $pid = fork (); if ( $pid == 0 ) { $url="http://ftp.auul.pri.ee/pub/OpenBSD/4.6/amd64/" . $fileset; exec "wget -q $url"; } else { print "fileset: $fileset, pid: $pid\n"; } } $kbdinput = <STDIN>;
Skripti töötamise ajal paistavad protsessitabelis sellised sissekanded
priit 31120 0.0 0.0 3472 1832 pts/15 Ss 10:13 0:00 bash priit 32057 0.0 0.0 3564 1376 pts/15 S+ 10:50 0:00 \_ perl frk.pl priit 32058 1.0 0.0 4048 1408 pts/15 S+ 10:50 0:00 \_ wget -q http://ftp.auul.pri.ee/pub/OpenBSD/4.6/amd64/bsd priit 32059 0.0 0.0 4048 1400 pts/15 S+ 10:50 0:00 \_ wget -q http://ftp.auul.pri.ee/pub/OpenBSD/4.6/amd64/base46.tgz priit 32060 0.0 0.0 4048 1400 pts/15 S+ 10:50 0:00 \_ wget -q http://ftp.auul.pri.ee/pub/OpenBSD/4.6/amd64/comp46.tgz priit 32061 0.0 0.0 4048 1380 pts/15 S+ 10:50 0:00 \_ wget -q http://ftp.auul.pri.ee/pub/OpenBSD/4.6/amd64/etc46.tgz priit 32062 0.0 0.0 4048 1408 pts/15 S+ 10:50 0:00 \_ wget -q http://ftp.auul.pri.ee/pub/OpenBSD/4.6/amd64/man46.tgz priit 32063 0.0 0.0 4048 1396 pts/15 S+ 10:50 0:00 \_ wget -q http://ftp.auul.pri.ee/pub/OpenBSD/4.6/amd64/misc46.tgz
IPC
TODO
Käsurea argumentide kasutamine skriptis
Argumentide programmi sees kasutamiseks sobib kasutada vaikimisi moodustatud massiivi ARGV, nt sellised
#!/usr/bin/perl print "$ARGV[0]\n"; print "$ARGV[1]\n";
ja käivitades
$ perl argv.pl tere mart tere mart
Standard-sisendi kasutamine skriptis
Standardsisendi (ingl. k. standard input) kasutamist kirjeldab näiteks selline programmilõik
#!/usr/bin/perl @read=<STDIN>; foreach $rida (@read) { print $rida; }
Regulaaravaldiste kasutamine
Skript esitab tekstifailist tunnusele vastavad read
open (fh, 'urlid.txt'); @read=<fh>; foreach $rida(@read) { if ($rida =~ /tartu\.ee/) { print $rida; } }
Tühikute pealt loendi moodustamine
$lause = "See on yks mitte eriti pikk lause"; @elemendid = split (/\s+/, $lause); $i = 1; foreach $element(@elemendid) { print $i++, ". ", $element, "\n"; }
Backreferencing
TODO
CPAN arhiivi kasutamine
CPAN arhiivis jagatakse Perli mooduleid lähteteksti kujul, st enne kasutamist tuleb üldiselt moodulid kompileerida ja seejärel paigadada. Moodulite kasutuselevõtmisel tuleb arvestada, et tihti eeldab moodul ühe või enama muu mooduli olemasolu, sel juhul tuleb sõltuvused enne paigaldada. Mooduli paigaldamisel saab üldiselt teha kindlaks, millised sõltuvused on vajalikud.
Mooduli paigaldamine käsitsi kompileerides
Olgu nt vajalik süsteemi lisada HTML::Diff moodul, tundub, et teda paketihalduses ei leidu
# apt-cache search html | grep diff | grep perl #
http://search.cpan.org/ otsingust saab leida, et mooduli aadress on
http://search.cpan.org/~ezrakilty/HTML-Diff/
kusjuures lähteteksti saab kopeerida aadressilt
http://search.cpan.org/CPAN/authors/id/E/EZ/EZRAKILTY/HTML-Diff-0.561.tar.gz
Peale lähteteksti lahtipakkimist saab lugeda README failist kompileerimise juhendit, mis on ka aadressil
http://cpansearch.perl.org/src/EZRAKILTY/HTML-Diff-0.561/README
Perli mooduli kompileerimiseks ja paigaldamiseks tuleb öelda reeglina
# perl Makefile.PL Checking if your kit is complete... Looks good Warning: prerequisite Algorithm::Diff 1.15 not found. Writing Makefile for HTML::Diff
Antud juhul näeme, et sõltuvus Algorithm::Diff v. 1.15 puudub süsteemist, aga selgub, et see on paketihalduses olemas, tuleb paigaldada
# apt-cache search algo | grep diff | grep perl libalgorithm-diff-perl - a perl library for finding Longest Common Sequences in text # apt-get install libalgorithm-diff-perl
Seejärel uuesti öeldes Makefile.PL ei peaks enam hoiatust saama. Järgmise sammuna tuleb tarkvara kompileerida
# make
Seejärel käivitada tarkvaraga kaasas olevad testid
# make test PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, './lib', 'blib/arch')" t/*.t t/01-diff.t .. ok All tests successful. Files=1, Tests=10, 1 wallclock secs ( 0.02 usr 0.01 sys + 0.04 cusr 0.01 csys = 0.08 CPU) Result: PASS
On näha, et testid õnnestusid. Lõpuks tarkvara paigaldada
# make install Installing /usr/local/share/perl/5.10.1/HTML/Diff.pm Installing /usr/local/man/man3/HTML::Diff.3pm Installing /usr/local/bin/htmldiff Appending installation info to /usr/local/lib/perl/5.10.1/perllocal.pod
Tulemusena lisata failisüsteemi kataloogi
/usr/local/share/perl/5.10.1
uus perli moodul HTML::Diff. Kusjuures, @INC teel asub /usr/local/share/perl/5.10.1 kataloog enne paketihaldusest paigaldatud perli katalooge nt
/usr/share/perl5
Mooduli paigaldamine cpan utiliidi abil
Perli perl paketi koosseisus on cpan utiliit, mis aitab paigaldada CPAN arhiivi tarkvara süsteemi
- otsib CPAN arhiivist sobivad versiooonid
- kopeerib üle võrgu kohale
- kompileerib
- lahendab sõltuvusi
Kasutamiseks sobib öelda nt
# cpan cpan> install Mozilla::CA
Süsteemi paidaldatud moodulid
Sellise käsuga saab küsida süsteemi paigaldatud Perli moodulite nimekirja
# perl -MFile::Find=find -MFile::Spec::Functions -Tlw -e 'find { wanted => sub { print canonpath $_ if /\.pm\z/ },\ no_chdir => 1 }, @INC'
kus
- -T taint checking
- -l automaatne reavahetusega lõpetamine
- -M laadib mooduli
- -w esitab hoiatusi
- -e järgnev on skripti sisu
Seejärel saab teha kindlaks, millised moodulid on paigaldatud paketihaldusest ja millised CPANist. Debiani paketihaldusega saab Perli mooduleid seostada selliselt
# for i in `perl -MFile::Find=find -MFile::Spec::Functions -Tlw -e 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, \ no_chdir => 1 }, @INC'`; do dpkg -S $i; done 1> perl-dpkg-20100603.log 2> perl-non-dpkg-20100603.log
perlform - väljundi formateerimine
$ cat format.pl #!/usr/bin/perl format ASJAD = @<<<<<< @||||||||| @>>>>> $mis, $tootja, $kogus . $mis = "Jahu123456"; $tootja = "Aidamees123456"; $kogus = 50; $~ = 'ASJAD'; write;
ning tulemusena
$ perl format.pl Jahu123 Aidamees12 50
Süsteemsete käskude täitmine
... system ("/bin/date > /tmp/rsnapshot.error");
UTF-8 kasutamine
UTF-8 kasutamine on erinevate Perl versioonide puhul mõningal määral erinev (5.8 vs 5.10 vs 5.14). Tundub, et v. 5.14 puhul sobib UTF-8 kodeeringus faili kirjutamist kasutada enne print käsku binmode direktiivi
$ cat skript.pl ... binmode(STDOUT, ":utf8"); print "$muutuja_vaartus_on_utf8\n";
Alternatiiviks on seada sobiv keskkonnamuutuja ja käivitada perl -C suvandiga
$ export LANG=et_EE.utf8 $ perl -C skript.pl
Kasulikud lisamaterjalid
Kasulikud lisamaterjalid
- http://en.wikipedia.org/wiki/Perl
- The Perl Journal - http://www.foo.be/docs/tpj/
- Learning Perl, 5rd Edition, Randal L. Schwartz, Tom Phoenix, brian d foy - sisaldab põgusamat keele käsitlust, 300 lk; tuntud ka nime all 'Llama book'
- Programming Perl, 3rd Edition, Larry Wall, Tom Christiansen, Jon Orwant - sisaldab põhjalikku keele käsitlust, 1000 lk; tuntud ka nime all 'Camel book'
- Perl Cookbook, 2nd Edition, Tom Christiansen; Nathan Torkington, 976 lk
- http://www.pm.org/
- http://www.perlmonks.org/
- http://www.tutorialspoint.com/perl/