Szkriptnyelvek II.
Perl programok
Perl ●
Practical Extraction and Report Language
●
Interpreteres nyelv
●
alkalmas szövegfeldolgozó alklmazások készítésére
●
strukturált programszerkezet
●
Szubrutinok támogatása
●
a UNIX rugalmas file kezelését használja
●
A Perl ingyenes
●
Larry Wall fejlesztette ki munkája megkönyítésére
Perl A Perl-t Larry Wall fejlesztette ki munkája megkönyítésére. Jelntés generátorra volt szüksége, amely több szöveges file-ból adott szabály alapján egy jelentést generál. Mivel az ehhez szükséges eszközök akkor nem álltak rendelkezésre, egy új eszközt hozott létre.
Perl A Perl nyelvnek a C programozási nyelvhez hasonló a strukturája. A C valamennyi operátora megtalálható benne, és a C programvezérlõ szerkezeteinek (if, while..) többsége is Komoly erőssége a C-vel szemben az interpreteres üzemmód és a szöveg és fájlkezelés
Perl programok ●
●
●
●
A Perl szokásos kiterjesztése a *.pl, ami UNIX/ Linux rendszerekben elhagyható Perl programok futtatása vagy az interpreter meghívásával > perl file.pl, Vagy a szkriptbe elején specifikált parancsértelmező és a futtatási jog kiadása (UNIX rendszereken) A perl hibakeresõjét az alábbi módon érhetjük el: perl -d file.pl
Perl adattípusok ●
decimális: 127 , 127.0 , 1.27E2
●
hexadecimális: 0x7F , 0x7f
●
Oktális: 0177
●
karakterlánc: "Hello vilag!\n" , 'Hello vilag!'
●
●
A Perl minden számot dupla pontosságú, lebegõpontos számként tárol. a Perlben nincs egész számú adattípus, de automatikusan konvertál
Perl változók Tömb $ Skalár @ Hash % ●
●
●
A változók nincsenek előre deklarálva, és bármelyik változó tárolhat füzért, *egészet* vagy mutatót A változók nem csak elemek homogén sorozatát tárolhatják. Egy véltozó több féle adatot is tárolhat időben egymás után.
Perl változók ●
Bármilyen alfanumerikus karaktersorozat lehet változónév, még kulcsszó is
●
$if
●
$ifthenelse
●
$while
●
$or
●
$andalso
Foglalt változók ●
●
●
olyan változók, mint a '$/', vagy, '$,' Speciális változók pl a $_, vagy másnéven default változó. Amennyiben nincs megadva valamelyik szerepre változó, akkor a Perl a $_ változót használja.
Tömbök ●
A tömbváltozók előtt nem $ hanem @ jel van. Ezeknek is lehet értéket adni, de természetesen nem skalár, hanem tömb értéket, pl: @tomb = (1, 2 , 3);
●
Itt a @tomb egy tömbváltozó. Mikor hivatkozunk rá, akkor a skalár változóknál megszokott módon tesszük $tomb[0];
Hash ●
●
●
●
A hash nem nullától n-ig indexelhető, hanem bármilyen értéket felvehet. Lehet az index szám, string, mutató, vagy bármilyen más skalár érték. Amikor az teljes hash változóra hivatkozunk, akkor % jelet írunk elé, mikor az egyes elemeire, akkor $ jelet, mivel egy eleme skalár érték. Az értékadás hasonló a tömb értékadáshoz: %scl = (1, 2 , 3 ,4 );
Hash ●
●
Az egyik elem indexe 1, a másiké 3. Az egyik értéke 2, a másiké 4. Perl nyelv nyújt egy sokkal olvashatóbb szintaxist a skalárokhoz:
%tomb = ( 1 => 2 , 3 => 4 , );
Változók ●
%variable
●
$variable
●
@variable
Pl.: $variable = 1234 @variable = (1,2,3,4) %variable = (1,2,3,4) %variable(1 => 3, 2=>4)
Változók kötése ●
●
●
A lokális változókat nem tartja meg a Perl, csak azt a memória helyet, ahol tárolódnak Ezért lehetséges a különböző típusú és tartalmú változók használata. Nem csak egyszerű változókra lehet rámutatni, hanem tömbökre, hash változókra, függvényekre, objektumokra, “bármire”...
Mutatók ●
Minden változó tartalmazhat (referenciát). A Perl nyelv kétféle referenciát ismer: –
A puha referencia a változók nevén keresztül éri el a tárolt értéket
–
a kemény referencia a változó helyére mutat.
$alma = 1; $korte = 'alma'; $dio = \$alma; print "$$korte = $$dio\n"; 1=1
Példa1 $szam=42; $string='? Na jó, de mi volt s kérdés?' print ($szam,' ',$string); Ha kódot a teszt1.pl file-ba irjuk fordítjuk: perl pelda1.p a 42? Na jó, de mi volt s kérdés? Eredményt kapjuk
Példa2 @napok=('Va','He','Ke','Csu','Pe','Szo'); print(@napok); print($napok[4]); @munkanapok=@napok[1..5] @ureslista=()
Asszociatív tömbök ● ●
●
● ●
A tömb skalár változókat tárol A tömbnek egész indexeket kell használnia a tömb valamely elemének kijelöléséhez az assziociatív tömb bármilyen értéket használhat. Indexértékeit kulcsnak (key) nevezzük. indexét (a kulcsot) kapcsos zárójelek ({}) közé tesszük
Példa3 $ara{'Alma'}=150; $ara{'Korte'}=200; print @ara{'Alma','Korte'}; print keys(%korok}; for $gyumolcsok (keys(%korok)) { print "$gyumolcs $ara{$gyumolcsok}\n"; }
Vezérlési szerkezetek ● ●
●
●
A Perl az utasításokat egymás után hajtja végre Az utasításokat általában pontosvessző zárja le (elhagyható egy blokk utolsó utasításánál). A program blokk utasítások egy csoportja { } között. Ez tekinthető, mint egy utasítás, ami tartalmazhat utasításokat, változókat, stb. A Perl tartalmazza a szokásos vezérlési szerkezeteket.
If if( kifejezés ) blokk vagy if( kifejezés ) blokk else blokk vagy utasítás if kifejezés vagy unless kifejezés
Példa4 Szintaktikai hiba! if( $a eq '1' ) $b = 2 else $b=4 Helyes if kifejezés: if( $a eq '3' ){ $b = 2 } else { $b = 4 }
Ciklusok Elől tesztelő ciklus:
while( kifejezés ) blokk Hátul tesztelő ciklus:
do blokk while( kifejezés ) For ciklus mint C-ben
for( kif1 ; kif2 ; kif3 ) blokk
Ciklusok for $valtozo ( lista ) blokk ●
●
●
Ez a ciklus végigmegy a lista összes elemén, és $valtozo minden egyes ciklus lefutásra az aktuális lista elem. Erre az időre ez a változó lokális, utána ugyanaz az értéke, mint ami előtte volt. Ebbe beleértendő az is, ha az értéke undef volt. Egy ciklusból ki lehet jönni előbb is, mint ahogy az véget érne. Ha valahol a ciklus belsejében végrehajtódik egy last utasítás, akkor a ciklus befejeződik.
Ciklusok ●
●
Ha egy ciklus előtt egy cimke van, akkor a last utasításban erre lehet hivatkozni, és akkor nem feltétlenül a legbelső ciklus futása szakad csak meg, hanem a körülötte levőké is, egészen a cimkézett ciklusig. Ehhez hasonlóan létezik egy olyan utasítás, amelyik újrakezdi a ciklust. Ezt a Perl next-nek hívja (itt is meg lehet adni cimkét).
●
●
A ciklus után meg lehet adni egy continue blokkot, amelyik akkor hajtódik végre, ha a ciklusban egy next utasítás van. A redo utasítás, ezt kikerüli, és újraindítja a ciklust.
$i = 0; while( $i < 7 ){ $i ++; print "start $i\n"; next if $i == 1; redo if $i == 2; last if $i == 4; print "end $i\n"; } continue{ print "$i countinue\n"; }
start 1 1 countinue start 2 start 3 end 3 3 countinue start 4
Szubrutinok sub teszt { print "Hello Világ"; return; } A szubrutinból kijönni a return utasítással lehet éppen úgy, mint C-ben, de ez el is hagyható. A return után lehet visszatérési érték. Ugyanúgy, mint C-ben egy szubrutinnak mindig van értéke, legfeljebb nem használjuk.
Szubrutinok ●
● ●
●
Egy szubrutint úgy lehet meghívni, hogy a neve elé az & jelet írjuk. Meg lehet hívni úgy is, hogy nem írunnk & jelet, de ez nem minden esetben működik. A függvényeknek paramétert lehet adni. A paramétereket ugyanúgy, mint más nyelveknél, a függvényhívás után kell vesszővel elválasztva írni, zárójelek között. Ezek a @_ tömbbe kerülnek bele, és így a $_[x] formában lehet rájuk hivatkozni.
Szubrutinok &rutin(1,2,3); sub rutin { print $_[0],$_[2],$_[3],"\n"; } rutin(1,2,3); A függvényeken belül hivatkozhatók a globális és a lokális változók is. Lokális kétféle lehet. Az egyik a függvényen belül helyileg lokális, a másik pedig időben, a függvény futási ideje alattlokális.
$v1 = 'global'; $v2 = 'global'; &rutin1; &rutin2; sub rutin1 { v1 $v1 ='v1'; v2 $v2 = 'local'; &rutin2; } sub rutin2 { print "$v1\n$v2\n"; }
Szubrutinok global local global global
Szubrutinok print &rutin1(100); sub rutin1 { my $i = shift; if( $i % 2 ) { $i+1 } else{ $i-1 } }
99
Szubrutinok ●
●
A példában a lokális változóba, egy shift operátorral, amelyikneka default argumentuma a @_ tömb, kivesszük a szubrutin argumentumát. Egy szubrutin értéke megegyezik az utoljára végrehajtott utasítás értékével. Ha ez egy return utasítás, akkor a return után írt kifejezés értéke a visszatérési érték.
Fájlok kezelése A Perl a UNIX operációs rendszerhez lett kitalálva, ahol a fájlal apfogalom, ezért nem csak könyvtári függvények, hanem programszerkezetek is rendelkezésre állnak a fájlok kezelésére. A fájlok megnyitására az open utasítás szolgál, a fájlok bezárására a close.
Fájlok kezelése open(F,"
f2.bak"); while( $line = ){ $line =~ s/",//g; $line =~ s/,"//g; print G $line; } close G; close F;
Fájlkezelés ●
● ●
●
A fájlokat nem változókkal azonosítjuk, hanem handlerekkel (kezelő) A fájl azonosító elé nem írunk$ jelet Az open utasítás második argumentuma nem egyszerűen a fájl neve, hanem egy olyan füzér, amely tartalmazza a fájl nevét és azt, hogy a fájlt hogyan akarjuk megnyitni: Megnyitás lehet: írásra, olvasásra, vagy mindkettőre
Fájlkezelés ●
●
Ha az open utasításban a második argumentumban a fájl neve előtt nincsen semmilyen jel, akkor a fájlt olvasásra nyitjuk meg. Ha a fájl neve előtt > jel van, akkor írásra nyitottuk meg a fájlt.
●
Ha a fájl neve előtt <jel van, akkor olvasásra.
●
Használható a >> jel a fájlhoz való hozzáírásra,
●
A +< a fájl írására és olvasására.
●
Erre használható a +> jel is, ez azonban megnyitáskor törli a fájlt.
Fájlkezelés ●
●
●
●
Skalár környezetben egy rekordot olvas be, lista környezetben pedig a hátralevő rekordok listáját. Egy rekord általában egy sor, mivel a rekord határoló karakter $/-ben megadva LF Ha $/-nek más értéket adunk, akkor a beolvasás is másképp hajtódik végre. Ha a $/ változónak undef értéket adunk, akkor egész fájlokat tudunk változóba nagyon gyorsan beolvasni.
Fájlkezelés ●
● ●
●
Ha egy fájlon belül akarjuk mozgatni a mutatót, akkor erre a legegyszerűbb módszer a seek függvény meghívása. Formája: seek Handler,Pozíció,Honnan a Handler a fájlkezelő, a Pozíció az a hely ahova állítani szeretnénk a mutatót, a Honnan paraméter pedig lehet 0, 1 vagy 2. Ha 0 akkor a fájlon belül a Pozíció a fájl elejétől számít, ha 1, akkor a mutató a pillanatnyi pozíciójához képest fog elmozdulni, ha pedig 2, akkor a fájl végétől számolunk.
Szkriptnyelvek ●
●
●
Általában ajánlatos ezt a függvényt meghívni minden olvasási és írási művelet között. Ennek az oka nem a Perl nyelvben keresendő, hanem azokban a könyvtári függvényekben, amelyeket az operációs rendszer biztosít a Perl programok számára. A seek meghívásának a hatására a kiírandó adatok kikerülnek a pufferből, míg egy olvasás utáni írásnál egyes operációs rendszereken nem.
Fájlok ●
●
A tell függvény megmutatja a mutató helyét a fájlban. Egy fájlt le lehet vágni a truncate függvénnyel, aminek két argumentuma van: –
●
●
a handler, és az új hossz.
Egyszerre több processz is írhat a fájlba. Ha le akarjuk foglalni, akkor az flock függvényt kell meghívni Argumentuma a handler és a lezárás módja:
Fájlok
●
–
2 - egyedi lezárás, más nem férhet hozzá a fájlhoz
–
8 lezárás megszüntetése.
A flock függvény addig fog várni, amíg hozzá nem lehet a megfelelő módon férni a fájlhoz, eközben a fájlmutató értéke nem változik.