Paketai, bibliotekos, moduliai |
Paketas - tai PERL priemonė nuosavos izoliuotos vardų erdvės sukūrimui. Paketas apibrėžiamas taip:
package NAMESPACE;
Pakete apibrėžiamas vardų erdvė galioja iki:
sekančio paketo
paprogramės pabaigos
operatorių bloko, apskliausto figūriniais skliaustais, pabaigos
eilutės, perduotos funkcija eval() pabaigos
failo galo
Pagal nutylėjimą laikoma, kad pagrindinė programa susijusi su paketu main, todėl PERL'e globaliais vadinami tie kintamieji, kurie priklauso paketui main. Norint kreiptis į kintamąjį iš kitos vardų erdvės, naudojama tokia sintaksė: $packageName::var . Speciali leksema __PACKAGE__ leidžia sužinoti esamo paketo pavadinimą. Pavyzdys:
#! /usr/bin/perl
$x= __PACKAGE__;
print "Package $x: \n";
print "\$x=$x\n";
print "\$two::x=$two::x \n";
package two;
$x= __PACKAGE__;
print " Package $x:\n";
print "\$x=$x\n";
print "\$main::x=$main::x \n";
Su kiekvienu paketu siejama ir simbolių lentelė. Tai asociatyvinis masyvas,
kurio pavadinimas susideda iš paketo pavadinimo ir : : (pvz.
%main::). Šio masyvo raktai - tai
pakete apibrėžtų kintamųjų identifikatoriai, o reikšmės -
typeglob tipo reikšmės t.y. nuorodos į
atitinkamus objektus. Taigi paketą galima laikyti asociatyviniu masyvu, todėl
peržiūrėdami tokio masyvo raktus, galime sužinoti visus pakete apibrėžtus
kintamuosius. Pavyzdžiui:
foreach $symname (sort keys %main::) {
local *sym = $main::{$symname};
print "\$$symname apibrėžtas\n" if defined $sym;
print "\@$symname apibrėžtas\n" if defined @sym;
print "\%$symname apibrėžtas\n" if defined %sym;
}
PERL kalba turi specialias paprogrames, vadinamas paketų konstruktoriumi ir destruktoriumi. Tai funkcijos BEGIN ir END. Iš esmės šios funkcijos nei kuria paketus, nei juos naikina. Funkcija BEGIN vykdoma iš karto, kai tik yra sukompiliuojama. Modulyje gali būti keletas tokių funkcijų, tuo atveju jos bus vykdomos viena po kitos ta tvarka, kaip buvo apibrėžtos.
Funkcijos END programinis kodas vykdomas pats paskutinis, kai PERL interpretatorius baigia darbą. Jei yra keletas END funkcijų viename modulyje, tai pirmiausiai bus įvykdyta ta, kuri yra anksčiausiai apibrėžta.
Autopaleidimas
Paprastai draudžiama paleisti funkciją, kuri nėra apibrėžta pakete. Tačiau
egzistuoja paprogramė AUTOLOAD, kuri
paleidžiama automatiškai, kai tik bandoma kreiptis į modulyje neapibrėžtą
funkciją. Kviestos funkcijos pavadinimas bei argumentų sąrašas priskiriami
globaliam spec. kintamajam $AUTOLOAD,
kuris po to gali būti sėkmingai naudojamas paprogramėje. Pavyzdys: sakykime, jog
norime paleisti UNIX komandas iš PERL programos, įvesdami tik komandų
pavadinimus. Tuomet reiktų daryti taip:
sub
AUTOLOAD {
my $program = $AUTOLOAD;
$program =~ s/.*:://; #
atskiriamas paketo pavadinimas
system($program, @_);
}
date(); #
įvykdoma UNIX komanda date
who('am', 'i'); #
įvykdoma UNIX komanda who ami
ls('-l'); #
įvykdoma UNIX komanda ls -l
PERL funkcijų automatinis paleidimas analogiškas C kalbos funkcijų dinaminiam užkrovimui, tačiau skirtumas tame, kad PERL funkcijos dinamiškai užkraunamos, kai į jas kreipiamasis, o tuo tarpu C/C++ dinaminės funkcijos užkraunamos kreipiantis į modulį.
Bibliotekos
Dažnai tikslinga kaupti bendros paskirties paprogrames tam, kad bet kada
prireikus jas būtų galima panaudoti kitose programose. Toks kaupimas atliekamas
grupuojant paprogames ir išsaugant jas atskiruose failuose. PERL'e tokia
paprogramių grupė vadinama biblioteka arba moduliu, jei
paprogramių grupėje papildomai deklaruojami eksportuojami kintamieji.
Istoriškai pirma buvo sukurtos bibliotekos (PERL v.4) todėl apie jas pirmiausiai ir nagrinėsime. Taigi biblioteka - tai paketas, kurio veikimo sritis apribota failu, todėl bibliotekos failo pirmoji eilutė pradedama taip:
package paketo_pavadinimas;
Bibliotekos failo pavadinimas dažniausiai turi plėtinį .pl. Norint naudoti biblioteką, ji turi būti iškviečiama funkcijos require pagalba. Ši funkcija programos vykdymo metu užkrauna išorinę funkciją iš PERL bibliotekos. Sintaksė:
require [myfile];
Jei parametras nenurodomas, tuomet naudojamas specialus kintamasis $_. Jei parametras nurodomas tuomet PERL interpretatorius tikrina specialiame asociatyviniaeme masyve %INC ar toks failas nebuvo prijungtas. Jei ne, tuomet vykdoma failo paieška kataloguose, nurodytuose specialiame masyve @INC. Reikia atkreipti dėmesį, kad failo pavadinimas (jei nurodomas ir plėtininys) turi rašomas kabutėse " ". Jei nurodomas tik pavadinimas t. y. be plėtinio, laikoma, kad failas yra modulis su plėtinio .pm.
Norint sukurti nuosavą PERL biblioteką ir ją
prijungti prie pagrindinės programos reikia:
Pavyzdys:
#! /usr/bin/perl
unshift (@INC, "~/perllib");
#sakykime, kad kataloge
~/perllib saugomos bibliotekos
require "my_lib.pl";
print "Funkcijos argumentų skaičius=",
NumOfArg(1,2,3,4,),"\n";
# Bibliotekinis failas my_lib.pl
package my_lib;
sub NumOfArg {
return $#_ +1;}
1;
Moduliai
Moduliai - tai bibliotekos, kuriuos turi
galimybę valdyti eksportuojamų
kintamųjų sąrašus. Tai reiškia, kad iškviečiant modulį dalis
kintamųjų gali būti importuoti pagal nutylėjimą, kita dalis importuojama tik tuo
atveju, jei jie yra aiškiai nurodomi funkcijos use argumentų sąraše.
Eksportuojamų kintamųjų valdymas atliekamas naudojant metodą import() ir spec. masyvus @EXPORT bei @EXPORT_OK. Masyve @EXPORT saugomi eksportuojamų pagal nutylėjimą kintamųjų identifikatoriai, o masyve @EXPORT_OK kintamųjų identifikatoriai, kurie turi būti aiškiai nurodomi argumentų sąraše.
Modulio faile apibrėžiamas tik vienas paketas. Failo pavadinimas sutampa su paketo pavadinimu bei turi plėtinį .pm (perl module). Modulio iškvietimui naudojama funkcija use(), kuri kontroliuoja importuojamų kintamųjų sąrašą arba require(), kuri nenaudoja import() metodo, todėl neimportuoja į pagrindinę programą jokių modulio kintamųjų.
Funkcijos
use() sintaksė:
use Modulio_pavadinimas [kintamųjų sąrašas];
use Perl_versija;
Funkcija use() užkrauna
modulį programos kompiliavimo metu bei automatiškai eksportuoja kintamųjų ir
funkcijų vardus į einamojo paketo vardų erdvę. Jei iškviečiant funkciją
use() nurodomas kintamųjų sąrašas,
tuomet importuojami tik tie kintamieji, kurie nurodyti sąraše. Kiekvienas
modulis turi turėti savo import()
metodą, todėl dažniausiai pasinaudojama galimybe paveldėti minėtą metodą iš
Exporter modulio. Kiekvienas paketas
turi savo spec. masyvą @ISA, kuriame
saugomi kitų paketų, susijusių su duotuoju, vardai. Tokiu būdu PERL kalboje
organizuojamas paveldimumo principai.
Pavyzdys: sudarykime savo modulį, kuris skaičiuotų argumentus:
package Argumentai;
#Paketo apibrėžimas
require Exporter;
#prijungiamas Exporter modulis
@ISA = qw(Exporter);
#sukuriamas
@ISA masyvas
@EXPORT = qw(MyArgs);
#pagal
nutylėjimą eksportuojami kintamieji
@EXPORT_OK = qw($MyArgs
@MyArgs
%MyArgs);
sub MyArgs{
my ($x, $y);
@MyArgs
= @_;
$MyArgs = $#MyArgs +1;
foreach $x (@MyArgs) {
$MyArgs{$x} = ++$y;
}
}
#!
/usr/bin/perl
#Pagrindinė programa main.pl
use Argumentai qw(:DEFAULT $MyArgs @MyArgs %MyArgs); # :DEFAULT reiškia, kad
reikia importuoti visus
MyArgs one two three four;
# kintamuosius, esančius
masyve @EXPORT
print "Argumentu
skaicius = $MyArgs; \n";
print "Argumentu
masyvas: @MyArgs; \n";
print "Argumentu
asociatyvinis masskaicius: \n";
foreach $k (keys %MyArgs) {
print "\$MyArgs{$k}
= $MyArgs{$k}\n";
}
Standartiniai PERL moduliai
Kartu su PERL distribucija yra platinamas modulių archyvas CPAN (Comprehensive Perl Archive Network). CPAN kopijos saugomos ir daugelyje PERL kalbai skirtų internetinių puslapių (pvz. www.perl.com/CPAN). Dalis standartinių modulių yra naudojami kaip kompiliatoriaus direktyvos. Jos PERL terminais vadinamos pragma-bibliotekomis arba tiesiog pragma. Paprastai šie moduliai įtakoja kompilavimo ir programos vykdymo procesus. Pavyzdžiui norint atlikti sveikaskaitinius veiksmus naudojama pragma integer. Norint sustabdyti pragmos veikimą, reikia naudoti funkcija no().
Keletas PERL 5.0 standartinių modulių:
Modulis |
Jo funkcija |
---|---|
autouse |
Defers loading of a module until it's used |
constant |
Creates compile-time constants |
Benchmark |
Checks and compares running times of code |
Config |
Accesses Perl configuration information |
Env |
Imports environment variables |
English |
Uses English or awk names for punctuation variables |
CGI |
Web server interface (Common Gateway Interface) |
Integer |
Does arithmetic in integer instead of double |
Getopt::Std |
Processes single-character switches with switch clustering |
lib |
Manipulates @INC at compile-time |
Shell |
Runs shell commands transparently within Perl |
strict |
Restricts unsafe constructs |
Symbol |
Generates anonymous globs; qualifies variable names |
subs |
Predeclares subroutine names |
vars |
Predeclares global variable names |