[ 27. January 2000]
- Svato_Straka
Regulárne výrazy III. - 8. časť CGI
V dnešnej (poslednej) časti rozpravy o regulárnych výrazoch v Perli si povieme čosi o modifikátoroch, ktoré sme si doteraz nespomenuli, rovnako sa pozrieme na príkaz nahradenia, ktorý nie je reg. výrazom i keď sa rovnako používa a vyzerá.
Tiež nás čaká príkaz split, ktorý uzatvára množinu základných príkazov úzko spojených s reg. výrazmi.
Modifikátory reg. výrazov
Práca operátorov porovnania (m// ) a nahradenia (s/// ) môže byť ovplyvnená niekoľkými modifikátormi:
Modifikátor
|
Význam
|
g
|
Hľadá globálne, nachádza všetky výskyty
|
i
|
Vyhľadáva výskyty bez ohľadu na veľkosť písmen
|
m
|
Zaobhádza s reťazcom ako s viacerými riadkami
|
o
|
Prekladá vzor len raz
|
s
|
Zaobchádza s reťazcom ako s jedným riadkom
|
x
|
Používa rozšírené reg. výrazy
|
e
|
Vyhodnotí pravú stranu ako výraz (len s///)
|
Operátor porovnania m// má nasl. základnú syntax:
m/VZOR/gimosx
/VZOR/gimosx
Operátor prehľadáva výraz na zhodu s reťazcom VZOR a vráti true alebo false. Ak je oddelovačom v tomto oerátore znak "/", úvodné "m" sa nemusí uvádzať. Ako oddelovače môžu byť použité ľubovoľné nealfanumerické znaky.
Reťazec VZOR môže obsahovať vložené premenné. Toto však vyhľadávanie spomaľuje, pretože premenná sa musí zakaždým vyhodnotiť a vzor sa musí znovu preložiť. Pokým chcete toto obmedziť, použite modifikátor /o, ktorý spôsobí že VZOR sa preloží len raz.
Oerátor nahradenia s/// má nasl. základnú syntax:
s/VZOR/NAHRAD/egimosx
Tento oerátor v prehľadávanom reťazci vyhľadá reťazec VZOR a nahradí ho reťazcom NAHRAD. Vráti počet úspešných nahradení (1, pri modifikátore g to môže byť aj viac) alebo hodnotu false pri neúspechu. Opäť platí to isté čo pri operátore porovnania - vkladanie premenných do vzoru a nahradenia spomaľuje nahradzovanie. Pokým zvolíte ako oddeľovač znak ' (apostrof), vo VZORe ani v NAHRADení nebude vykonané vloženie premenných.
Modifikátor /e v operátore nahradenia spôsobí, že nahradzovacia časť (NAHRAD) bude vyhodnotená ako výraz, nie ako reťazec.
Príkaz nahradenia tr///
Ako som už v úvode spomenul, aj keď rovnako vyzerá a používa sa, príkaz nahradenia tr/// nie je v skutočnosti reg. výrazom. Jeho základná syntax je nasledovná:
tr/ZOZNAMPREHLADANIA/ZOZNAMNAHRADENIA/cds
y/ZOZNAMPREHLADANIA/ZOZNAMNAHRADENIA/cds
Tento príkaz prechádza prehľadávaný reťazec znak po znaku a všetky výskyty znakov, ktoré sú obsiahnuté v ZOZNAMPREHLADANIA nahradí zodpovedajúcim znakom zo ZOZNAMNAHRADENIA. Vráti počet nahradených znakov.
Modifikátor
|
Význam
|
c
|
Doplnok k ZOZNAMPREHLADANIA
|
c
|
Nájdené nenahradzované znaky vymaže
|
s
|
Zrazenie viacnásobne nahradených znakov
|
Pokým je použitý modifikátor /c , budú nahradené všetky znaky, ktoré nie sú obsiahnuté v ZOZNAMPREHLADANIA. Skutočný ZOZNAMPREHLADANIA je teda doplnkom k zadanému.
Pri použití modifikátoru /d budú všetky znaky zo ZOZNAMPREHLADANIA, ktoré nemajú uvedený v ZOZNAMNAHRADENIA svoj ekvivalent, vymazané. Pokým totiž použijete príkaz tr/// v ktorom je ZOZNAMPREHLADANIA kratší ako ZOZNAMNAHRADENIA, bude posledný znak zo ZOZNAMNAHRADENIA opakovaný tak dlho, kým ZOZNAMNAHRADENIA nebude mať rovnakú dĺžku ako ZOZNAMPREHLADANIA. Napr. pri príkaze tr/ABC/ab/ bude písmeno "C" nahradené písmenom "b".
Ak je uvedený modifikátor /s , postupnosti znakov, ktoré majú byť nahradené rovnakým znakom zo ZOZNAMNAHRADENIA sú nahradené jediným týmto znakom.
Príkaz split
Posledným zo základnej skupiny príkazov využívajúcich perlovské regulárne výrazy je príkaz split . Jeho základná syntax je nasledovná:
split /VZOR/, VÝRAZ, LIMIT
split /VZOR/, VÝRAZ
split /VZOR/
split
Tento vo VÝRAZe hľadá rozdeľovacie znaky a v ich miestach VÝRAZ rozdeľuje na podreťazce, ktoré vráti ako zoznam. Oddelovače sú určené opakovaným prehľadávaním VÝRAZu na výskyt reťazca VZOR (VZOR je teda chápaný ako oddelovač).
Pokým je použitý parameter LIMIT, split rozdelí VÝRAZ na max. LIMIT podreťazcov.
Pokým nie je špecifikovaný VÝRAZ, bude prehľadaný a rozdelený obsah premennej $_. Ak je vynechaný aj VZOR, bude vykonané rozdelenie v miestach všetkých prázdnych znakov okrem tých, ktoré sa nachádzajú na začiatku reťazca.
To by bolo o reg. výrazoch v Perli všetko, nabudúce sa pozrieme Server Side Includes (SSI).
|
|
|