Perl
Sisukord
- 1 Sissejuhatus
- 2 Perli paigaldamine
- 3 Programmeerimine Perlis
- 4 Perli skript
- 5 Sõne-operatsioonid
- 6 Andmestruktuurid
- 7 Failioperatsioonid
- 8 Tingimused
- 9 Kordused
- 10 Funktsioonid
- 11 HTTP
- 12 PostgreSQL andmebaasi kasutamine
- 13 MySQL andmebaasi kasutamine
- 14 Oracle andmebaasi kasutamine
- 15 DNS
- 16 LDAP
- 17 Käsurea argumentide kasutamine skriptis
- 18 Standard-sisendi kasutamine skriptis
- 19 Kasulikud lisamaterjalid
Sissejuhatus
TODO
Perli paigaldamine
Debian Lenny paketihaldus sisaldab Perl v. 5.10 tarkvara.
Programmeerimine Perlis
TODO
Perli skript
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
Sõne
Sõne (ingl. k. string) on järgnevus tähti-numbreid-muid-sümboleid
'abcdefgh'
Arv
Arv (ingl. k. number) võib olla nt täisarv või ujukomaarv
15
Kuna Perl on nõrga tüübiskeemiga keel, siis saab nt liita arve ja sõnesid
print "mina tulen kell " . 10 . "\n";
Masiiv
Massiiv (ingl. k. array) ...
Sõnastik
Sõnastik (ingl. k. associative array)
%sonastik = ("Priit", 28 ,"Mart", 19, "Mari", 18, "Endel", 65);
Sõnastiku elemendi "Priit" poole saab pöörduda nii, elemendi väärtuseks on 28
$sonastik{"Priit"};
Failioperatsioonid
Failioperatsioonid tegelevad failist lugemise ja faili kirjutamisega.
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
Kirjutamine
Faili kirjutamist kirjeldab nt selline programmilõik
@read = ("loomaaed.tartu.ee", "kuutorvaja.eenet.ee", "www.eesti.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
Tingimused
Perlis saab kasutada selliseid tingimusi
- if-elsif-else tingimus
$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"; }
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
TODO
HTTP
TODO
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;
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
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 rida on
Kasulikud lisamaterjalid
- man DBD::Pg
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
TODO
Oracle andmebaasi kasutamine
Perlist Oracle andmebaasi kasutamise eelduseks on, et süsteemis saab kasutada 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*
Nt selline skript kasutab Oracle andmebaasi
use strict; use DBI; 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() ) { print "$nimi, $vanus\n"; } $sth->finish(); $dbh->disconnect();
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',
DNS
TODO
LDAP
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; }
Kasulikud lisamaterjalid
TODO