Modulok

A Perl nyelv lehetőséget ad arra, hogy az egyes funkciókat modulokba gyűjtsük, és ezeket a modulokat felhasználjuk más programokban. Ez gyakorlatilag annyit jelent, hogy a modulok változói más szimbólumtáblában kerülnek elhelyezésre, és így bármiképpen is lettek elnevezve, nem zavarják más programrészek változóit.

A modulok változóit, szubrutinjait természetesen kívülről is el lehet érni, és használni. Ebben az esetben a $modul::változó alakot kell használni.

Egy modul definícióját mindig a package kulcsszó vezeti be, amelyet a modul neve követ. Az alapmodul, amelyet eddig is ismertél a main, amely a változók és függvények neve elől akár el is hagyható, így $v, $::v és $main::v ugyanazt a változót jelölik.

Modulok egymáson belül is elhelyezkedhetnek, ebben az esetben a külső és a belső modul nevét is meg kell adni: $kulso::belso::valtozo.

Nézzünk meg egy egyszerű példát:

$barack = &gyimilcs::kukac;
print "$barack, $gyimilcs::barack\n";
exit;

package gyimilcs;
sub kukac { 
$barack = 'repa';
'karotta' }
amelynek kimenete:
karotta, repa

A példaprogram a gyimilcs modul kukac szubrutinját hívja meg, amely a modul $barack változójának értékét beállítja, ugyanakkor a visszatérési érték a main modul azonos nevű változójába kerül.

Amikor egy modult használunk, akkor általában jó, ha a modul külön fájlban van. No nem azért, mert a modulnak külön fájlban kell lennie, de nagyon gyakran előfordul, hogy egy modult az egyik ember megírja, és nagyon sokan meg használják. Ha ilyenkor mindenki beszerkesztené a modult a saját programjába, akkor meglehetősen nagy forrásprogramok keletkeznének, és az egész nagyon áttekinthetetlen lenne.

Ha egy modul egy külön fájlban van, akkor külön meg kell mondani a Perl értelmezőnek, hogy a modult használni akarjuk. Erre a use kulcsszó való. Ez után kell megadni a modul fájlnak a nevét, amely ugyan az, mint a modul neve, ami a package kulcsszó után áll. A fájl kiterjesztése .pm, de ezt NEM írjuk a use kulcsszó után.

Ha van egy egyszerű modulunk például a modul1.pm fájlban, és ezt használni szeretnénk a prog.pl fájlból, akkor ezt a következő módon tehetjük meg:

push @INC, '.';

use modul1;

&modul1::szia;

és persze a kimenet:
Betöltődött a modul1 modul.
Rettenetesen örülök neked!
Kitörlődött a modul1 modul.

Ezek után két alapvető kérdés merül fel:

  1. Mi van a modulban?
  2. Minek a push @INC ... utasítás?
Az elsőre nagyon könnyű válaszolni:
package modul1;

BEGIN {
  print "Betöltődött a modul1 modul.\n";
  }

END {
  print "Kitörlődött a modul1 modul.\n";
  }


sub szia {
  print "Rettenetesen örülök neked!\n";
  }

1;
és ez a válasz máris további kérdéseket generált: mi az a BEGIN és mi az az END. Csak sorjában.

Az a push utasítás az INC tömb végére rakja az egy pontot tartalmazó füzért. Ezt már az eddigiek alapján is tudnod kell. Az INC tömb egy speciális tömb, amelyet a Perl interpreter használ, és a modul fájlokat azokban a könyvtárakban (directory-kban) próbálja megkeresni, amelyek szerepelnek ebben a tömbben. Írassuk ki az én rendszeremen:

C:\Perl5\lib\i386-win32
C:\Perl5\lib
.
Ebből például látszik az, hogy ezt a könyvet Windows rendszeren írom.

Verhás Péter Home Page . . . . . . Perl röviden, tartalomjegyzék