Programozás PERL-ben, kezdőknek

Bevezető

A PERL (Practical Extraction and Report Language) programozási nyelv

erő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. A

Unix-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 a perl 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 a file.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 a

file.txt tartalma nem változik meg, az eredmény a

masik.txt-be kerül.

A -e kapcsoló után kerülő parancs ebben az esetben egy reguláris

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 szerkezete


Az 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ók


A 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

Az első PERL program


#!/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ég fopen 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"-vel

    kezdő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

    a /a+bc/ kifejezésre azok a stringek felelnek meg, melyben egy vagy

    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 karakter

    után a "dfg" követi.

További példák:

  • /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.

Szöveg csere szintaktikája: 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

Például:

$s = "SZOVEG";print '$s csere előtt: ', $s, "n";$s =~ s/szo/lo/i;print '$s csere után: ', $s, "n";

Ezek után egy kicsit bonyolultabb példa:

#!/usr/bin/perluse warnings;open (FH1, "<", "f1.txt") or die "Nem sikerult a fajl megnyitasa olvasasra.";open (FH2, ">", "f2.txt") or die "Nem sikerult a fajl megnyitasa irasra.";while (defined ($line = )) { chomp $line; if ($line =~ /^d/) { print FH2 $line . "n"; }}close FH2;close FH1;

A fenti program f1.txt-t megnyitja olvasásra, f2.txt-t írásra. Majd

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 a

http://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.

Oldalak