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:

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:

  1. Sukurti katalogą, kuriame bus saugomi bibliotekiniai failai;
  2. Išsaugoti paprogrames, kaip atskirus PERL failus;
  3. Kiekvieno failo paskutinėje eilutėje įrašyti “1”. Tai reikalinga tam, kad jei bus naudojama funkcija do, ji grąžintų 1, kaip sėkmingo paprogramės darbo žymę.
  4. Pagrindinėje programoje naudoti direktyvą require, kurios argumentais būtų bibliotekiniai failai;
  5. Spec. masyvą @INC papildyti katalogu, kuriame saugomos bibliotekos.


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


 

Į turinį