Weblabor - A kiindulopont webmestereknek
Leírások+Referenciák / Perl röviden / 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 = &gyumolcs::kukac;
print "$barack, $gyumolcs::barack\n";
exit;

package gyumolcs;
sub kukac { 
$barack = 'repa';
'karotta' }

amelynek kimenete:

karotta, repa

A példaprogram a gyumolcs 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.