Bevezető
A PERL (Practical Extraction and Report Language) programozási nyelverőssége a szöveges adatok manipulálása. Interpreter jellegű a nyelv,
tehát futásidő alatt fordul le (mint a BASIC).
Szintaktikája hasonlít a C-hez, tehát aki C-ben programozott könnyebben
megtanulhatja. Ez a kis leírás is inkább olyanoknak szól, akik programoztak
már C-ben, C++-ban, Javaban vagy PHP-ben.
A nyelvre jellemző, hogy ugyanaz a feladat
többféleképpen oldható meg, ami megnehezítheti más programjának megértését.
(Például fájlt is legalább háromféleképpen nyithatunk meg...)
PERL programunkat számos operációs rendszer alatt futtathatjuk. AUnix-szerű (Linux, *BSD, stb.) operációs rendszerek alatt
alapfelszerelés, Windows alá is több fajtája letölthető.
Ha feltelepítettük a PERL-t és aperl parancs hatására
elindul az interpreter, akkor mindent jól csináltunk.
A Ctrl-D billentyűkombinációval ki is léphetünk.
Először nézzünk néhány egyszerű példát. Hogyan lehet alapvető
szövegcserélésre használni a PERL-t.
perl -p -i -e "s/mit/mire/" file.txt A fenti parancs hatására afile.txt fájlban az összes
'mit' szöveg 'mire' cserélődik. (Bár ebben az
esetben, ha egy sorban többször fordul elő a 'mit' szöveg,
csak az első változik meg. Erről majd később.) Most kicsit bővebben: A -e
kapcsoló hatására a következő paramétert, mint programot hajtja végre.
A -p kapcsoló megadásával a programot a megadott fájlon hajtja végre
soronként, majd az eredmény a szabványos kimenetre irányítja (STDOUT).
Az -i-vel pedig az eredmény a megadott fájlba kerül vissza.
perl -p -e "s/mit/mire/" file.txt >masik.txt Ez a parancs ugyanazt teszi, mint az előző, csakhogy afile.txt tartalma nem változik meg, az eredmény a
masik.txt-be kerül.
kifejezés (Regular Expression, REGEXP, stb.). Nem csak a PERL-ben
használhatjuk őket, hanem C/C++-ban, Javaban, PHP-ben, MySQL-ben is.
A reguláris kifejezésekről később tárgyalunk.
A PERL program szerkezeteAz interpreter nem sororientált (mint a BASIC vagy a Python), hanem az
utasításokat mindig pontosvessző zárja le.
A komment jele a kettős kereszt. A # jel utáni szöveg a sor végéig
megjegyzés. Ha pl. Linux alatt fejlesztünk a következőképpen tehetjük
índíthatóvá programunkat. Az első sorba kerüljön a
#!/usr/bin/perl szöveg, majd a chmod +x fileneve
paranccsal futtathatóvá tehetjük a programot. Windows alatt legegyszerűbb
a társítás funkcióval kiválasztani a perl.exe-t és utána
úgy indíthatjuk, mint bármilyen más programot.
Az utasításblokkokat { és } jel határolja.
A beépített PERL funkciók hívásakor a paramétereket nem kell
zárójelpárok közé tenni (pl. print, open, close, chomp, stb.).
Természetesen nem baj, ha zárójeleket teszünk.
VáltozókA PERL gyengén típusos nyelv, tehát nem kell megadni a változók típusát
előre, sőt definiálni sem kell őket.
A " jellel határolt stringekben használhatók a C-ből ismert escape
szekvenciák (n, xnn és társai). Stringbe írva változó nevet a
változó értéke behelyettesítődik.
A ' (aposztróf) jellel határolt stringekben nem érvényesek ezek a
szekvenciák. A ` jellel határolt stringek tartalmát a PERL interpreter
futtatja, mint külső parancsot.
A skaláris változók \$ jellel kezdődnek. Például:
$szam = 15;print "Szam: ", $szam, "n";print "Szam: $szamn"; # behelyettesíti a 15-öt (ugyanazt írja mint az előbbi)print 'Szam: $szamn'; # nem helyettesít be semmit$ls =ls; # Linux alatt mukodikprint "ls: $lsn"; # aktualis konyvtar listajat irja ki
A tömbök @ jellel kezdődnek.
@tomb = ("egy", 2, "harom", 4, 5);print "tomb: @tombn";@dir = `dir`; # vindoz alatt megyprint "dir: @dir"; # akrualis konyvtar listajat irja ki
#!/usr/bin/perluse warnings;if (!open (FH, ">", "szoveg.txt")) { die "Nem sikerult a fajl megnyitasa.";}print FH "Hello world!";close FH; A
use kulcsszóval különféle hasznos modulokat tölthetünk be,
de a use warnings parancs hatására figyelmeztető üzeneteket
kapunk az interpretertől, amelyek hasznosak lehetnek hibakereséskor.
Az open (FH, ">", "szoveg.txt") kóddal nyithatunk meg egy
fájlt írásra. A ! a tagadás (a "not" hatása is ugyanaz). Az FH
filehandle-el hivatkozhatunk a fájlra. A die paranccsal
kilép a programból miközben az STDERR kimenetre hibaüzenetet ír.
Beleírunk a fájlba egy kis szöveget, majd lezárjuk a fájlt és a program
futása véget ér.
A következő program ugyanazt teszi, mint a felső. Csak egy kicsit
másképpen. A FileHandle fájlkezelő objektum felhasználásával.
#!/usr/bin/perluse warnings;use FileHandle;$FH = new FileHandle ("szoveg2.txt", "w");if (!defined ($FH)) { die "Nem sikerult a fajl megnyitasa.";}$FH->print ("Hello world!");$FH->close (); Fájlt mégfopen használatával is megnyithatunk. Ez a funkció
ugyanúgy működik, mint a C-s fopen. Figyeljük meg, hogy a
változók neve előtt \$ jel van, a filekezelők neve előtt viszont nincs
\$ jel. A továbbiakban a sima open-es megoldással nyitjuk
meg a fájlokat.
Reguláris kifejezések (Regular Expression, REGEXP)A =\~
operátorral vizsgálhatjuk meg, hogy egy stringre érvényes-e egy reguláris
kifejezés. A reguláris kifejezést két perjel közé tehetjük (tehetjük két
# jel közé is, a lényeg, hogy egyforma legyen a két jel). A /abc/
kifejezéssel megvizsgálhatjuk, hogy a stringben szerepel-e valahol
az "abc" string. Lássunk erre példát:
$line = "abcdef";if ($line =~ /abc/) { print "megvan";} Vezérlő karakterek:- \^ (kalap) karakter: sor elejének megfeleltetése. Például: a /\^ab/
kifejezésre csak az "ab"-vel kezdődő stringek felelnek meg.
- \$ (dollár) karakter: a sor végének megfeleltetése.
-
Escape szekvenciák:
- n: enter - t: tabulátor - s: whitespace (tab, space vagy enter) - S: nem whitespace - d: szám - D: nem szám - w: alfanumerikus karakter (a-z, A-Z, 0-9) - W: nem alfanumerikus karakter - b: szó határ - B: nem szó határ - .: pont - +: plusz - ": " karakter - *: * karakter - ?: kérdőjel karakter- . (pont) karakter: bármilyen karakterre illeszkedik. - []: a zárójelben megadott karakterekre felel meg. Például: a
/\^ab[xyz]cd\$/ kifejezés olyan stringekre felel meg ami "ab"-velkezdődik utána x, y vagy z karakter lehet, majd utána "cd" stringre
végződik.
-
- (plusz) karakter: egy vagy több karakterre felel meg. Például
több "a"-t követ "bc" string.
-
* (csillag) karakter: nulla vagy több karakterre felel meg.
- ? (kérdőjel) karakter: nulla vagy egy karakterre illeszkedik.
- .* karakterek: bármilyen karakterekre megfelelnek.
-
(): a zárójelben megadott további kifejezések a \$n változókba
kerülnek, ahol n egy 1-től kezdődő szám. Ha a /\^(d+)t(w+)/kifejezést használjuk, az egy vagy több számmal kezdődő majd egy
tabulátorral elválasztott alfanumerikus karaktereket tartalmazó
sorok felelnek meg és a számok a \$1, az alfanumerikus karakterek a \$2
változóba kerülnek.
-
{i,j}: a zárójelben megadott intervallum mennyiségű karakterre
felel meg. A /\^.{3,5}dfg/ megfelel minden string ami 3, 4 vagy 5 karakterután a "dfg" követi.
- /ab?c/ kifejezés csak az "ac" és az "abc" stringre illeszkedik.
- /a.?e/ kifejezés csak az "ae" és az "a.e" stringre illeszkedik.
- /ab*c/ kifejezés megfelel az "ac", "abc", "abbbbbc" stringekre is
- /a.*z/ kifejezésre azok a stringek felelnek meg, melyekben "a"
betű után nulla vagy több "." van és utána "z".
- /a.*z/ kifejezésre azok a stringek felelnek meg, melyekben "a"
után bármilyen karakter szerepel, utána egy csillag majd "z" betű.
- /a++z/ kifejezés: "a" után egy vagy több plusz jel szerepel
majd "z" betű.
- /a++z/ kifejezés csak az a++z stringre illeszkedik.
-
/\^+ds+w+/ kifejezésre a plusz jellel kezdődő string illeszkedik,
ami egy számmal folytatódik, majd tabok illetve space-ek követhetik(de legalább egy space vagy tab) majd pedig alfanumerikus karakterek
követik. Az alfanumerikus karakterek után pedig lehet bármi.
s/mit/mire/Például:
$s = "Szoveg";print '$s csere előtt: ', $s, "n";$s =~ s/Szo/Lo/;print '$s csere után: ', $s, "n";
A reguláris kifejezés mögé írható leggyakoribb paraméterek:
- i: Nem érzékeny a kis- és nagybetűkre
- g: Csere esetén egy sorban található összes előfordulást cserél
beolvassa az összes sort a fájlból és ha a sor első karaktere számmal
kezdődik a sort kiírja f2.txt fájlba. Az open után a <
karakter az
olvasást, a > az írást, a >> a hozzáírást jelenti. A <FH> kóddal
egy sort
olvashatunk az FH fájlkezelővel jelölt fájlból (ill. streamből).
A defined-el pedig megvizsgálhatjuk, hogy sikerült-e az
olvasás (definiálva van-e a \$line változó). A chomp paranccsal
levágjuk a megadott string végéről a kocsivissza karaktert.
Majd megnézzük, hogy a regexp érvényes-e a \$line-ra, ha igen kiírjuk
a f2.txt-be a változót. Megemlítem még a kifejezés or die
"üzenet"; kódot, ami gyakran előfordul PERL scriptekben.
Az or parancs logikai VAGY-ot jelent, melynek először a
bal oldala értékelődik ki. Ha a bal oldal hamis a jobb is végrehajtódik.
Tehát ha az open függvény hamis értéket ad vissza
végrehajtja a die parancsot és a program futása
megszakad, miután kiírtuk a hibaüzenetet.
A PERL nyelvről például ahttp://www.perldoc.com honlapon
olvashatunk. Továbbá érdemes a programmal kapott HTML ill. manual
lapok olvasgatása. Linux alatt a perldoc programmal
olvashatunk leírásokat. A leghasznosabb a perldoc -f
<fuggveny>
parancs, amellyel függvények leírását olvashatjuk el.