Perl

Allikas: Kuutõrvaja

Sisukord

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", "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

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

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.aso.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;

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;

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',

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" <mart@loomaaed.tartu.ee>',
     From    => '"Priit Kask" <priit@loomaaed.tartu.ee>',
     Subject => "Oluline teade",
  ],
  body => "See kiri on saadetud libemail-sender-perl abil.\n",
);

my $transport = Email::Sender::Transport::SMTP->new({
   host => '192.168.1.250',
   port => 25,
});

sendmail($email, { transport => $transport });

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.aso.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.aso.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.aso.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.aso.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.aso.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.aso.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.aso.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

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

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

Kasulikud lisamaterjalid

Välja otsitud andmebaasist "http://kuutorvaja.eenet.ee/wiki/Perl"
Personaalsed tööriistad