Substituce a nahrazov�n� znak�


Perl um� prov�d�t substituci zalo�enou na pou�it� regul�rn�ch �et�zc�. Substituce se prov�d� pomoc� funkce s, kter� je podobn� substituci ve vi editoru. Pro substituci se pou�ije srovn�vac� oper�tor =~. Pokud je srovn�vac� oper�tor vynech�n prov�d� se substituce na prom�nn� $_.

Chcete-li nahradit v�skyt �et�zce london �et�zcem London v prom�nn� $sentence pou�ijte p��kaz

$sentence =~ s/london/London/
Je-li �et�zec ulo�en� v prom�nn� $_, pak m� p��kaz pro uvedenou n�hradu tvar
s/london/London/
V�imn�te si, �e dva regul�rn� �et�zce jsou obklopeny celkem t�emi lom�tky.

P��kaz vrac� po�et proveden�ch substituc�, v tomto p��pad� 0 (false) nebo 1 (true). V�raz pro substituci je tedy mo�n� pou��t i jako podm�nku v p��kazu if.


Volby

Uveden� p��klad nahradil pouze prvn� v�skyt �et�zce, m��eme v�ak po�adovat nahrazen� v�ech v�skyt� dan�ho �et�zce. Nahrazen� v�ech v�skyt� �et�zce provedeme tzv. glob�ln� substituc�, tj. za posledn� lom�tko p�id�me p�smeno g:
s/london/London/g
op�t je mo�n� pou��t prom�nnou $_.
P��kaz vrac� po�et proveden�ch substituc�, tj. 0 (false) nebo ��slo v�t�� ne� 0 (true).

Chceme-li nahradit v�skyt lOndon, lonDON, LoNDoN atd., �et�zcem London m��eme pou��t p��kaz

s/[Ll][Oo][Nn][Dd][Oo][Nn]/London/g
Existuje v�ak jednodu��� zp�sob, a to pou��t volbu i (pro "ignore case"). P��kaz
s/london/London/gi
provede glob�ln� substituci s ignorov�n�m typu p�smen (mal�, velk�).


Opakovan� pou�it� vyhledan�ch �et�zc�

�asto je pot�eba pod�et�zec nalezen� na jednom m�st� v �et�zci opakovan� pou��t (nap�. vlo�it) na jin�m m�st� v �et�zci. Vyhledan� pod�et�zce jsou ukl�d�ny do prom�nn�ch $1,...,$9. Tyto �et�zce mohou b�t pou�ity v dan�m RE (nebo substituci) pomoc� speci�ln�ch RE znak� \1,...,\9. Nap��klad
$_ = "Lord Whopper of Fibbing";
s/([A-Z])/:\1:/g;
print "$_\n";
nahrad� ka�d� velk� p�smeno stejn�m p�smenem obklopen�m z ka�d� strany dvojte�kou. Vytiskne se tedy :L:ord :W:hopper of :F:ibbing. Prom�nn� $1,...,$9 jsou read-only; nen� mo�n� je modifikovat.

Dal�� p��klad je p��klad testov�n�

if (/(\b.+\b) \1/)
{
	print "Slovo $1 se opakuje\n";
}
Ozna�� ka�d� opakuj�c� se slovo. Ka�d� \b p�edstavuje hranici slova a znak .+ p�edstavuje libovoln� nepr�zdn� �et�zec, tedy \b.+\b p�edstavuje cokoli mezi dv�mi hranicemi slova, tedy slovo. Pou�ili jsme z�vorky a obsah z�vorek byl ulo�en jako speci�ln� znak \1. Tento sleci�ln� znak m��eme pou��t v dan�m regul�rn�m v�razu. Ve zbytku programu m��eme pracovat s prom�nnou $1, kter� m� stejn� obsah jako speci�ln� znak \1.

N�sleduj�c� p��klad vym�n� prvn� a posledn� znak na ��dku. ��dek je ulo�en� v prom�nn� $_

s/^(.)(.*)(.)$/\3\2\1/
Znaky^ a $ reprezentuj� za��tek a konec ��dku. V \1 je ulo�en prvn� znak; v \2 je cokoli a� do posledn�ho znaku, kter� je ulo�en v \3. Cel� ��dka je tedy nahrazena ��dkou s prohozen�mi znaky \1 a \3.

P�i vyhled�v�n� jsou napln�ny i speci�ln� read-only prom�nn� $` a $& a $', kter� je mo�n� d�le v programu pou��t. Prom�nn� jsou napln�ny n�sleduj�c�m zp�sobem:
$` za��tek �et�zce, a� do vyhled�van�ho pod�et�zce $& vyhled�van� pod�et�zec $' konec �et�zce od vyhled�van�ho pod�et�zce. Tedy pokud napln�me prom�nnou $_ a provedeme uveden� vyhled�n� pod�et�zce pp v prom�nn� $_

$_ = "Lord Wopper of Fibbing";
/pp/;
jsou v�echny n�sleduj�c� v�razy jsou pravdiv�: (P�ipome�me, �e eq je �et�zcov� porovn�n�.)
$` eq "Lord Wo";
$& eq "pp";
$' eq "er of Fibbing";

P�ed vyhled�v�n�m se prov�d� konverze prom�nn�ch, kter� jsou pou�ity uvnit� lom�tek. Tedy p��kaz

$search = "the";
s/$search/xxx/g;
nahrad� ka�d� v�skyt �et�zce the v prom�nn� $_ �et�zcem xxx. Pokud chcete nahradit ka�d� v�skyt �et�zce there, pak nezad�vejte s/$searchre/xxx/, nebo� by se nahrazovalo jm�no prom�nn� $searchre jej�m obsahem. Ale jm�no prom�nn� uzav�ete do slo�en�ch z�vorek, spr�vn� p��kaz tedy vypad�
$search = "the";
s/${search}re/xxx/;


Nahrazov�n� znak�

Funkce tr umo��uje nahrazovat znak jin�m znakem. N�sleduj�c� p��kaz nahrad� v prom�nn� $sentence ka�d� znak a znakem e, ka�d� znak b znakem d, a ka�d� znak c znakem f.
$sentence =~ tr/abc/edf/
P��kaz vrac� po�et proveden�ch nahrazen�. Je tedy mo�n� nap��klad p��kazem if testovat, zda se nahrazen� provedlo nebo ne.
if ( $sentence =~ tr/abc/edf/) {
   print "nahrazeni provedeno\n";
   }
   else {
   print "v retezci se nevyskytuji znaky abc\n";
   } 

V�t�ina speci�ln�ch znak� pro RE se ve funkci tr nepou��v�. N�sleduj�c� p��klad zji��uje po�et hv�zdi�ek v prom�nn� $sentence a zji�t�n� ��slo ulo�� do prom�nn� $count.

$count = ($sentence =~ tr/*/*/);
Poml�ka znamen� znaky mezi explicitn� uveden�mi znaky.
P��klad p�evede obsah prom�nn� $_ na velk� p�smena.
tr/a-z/A-Z/;


Cvi�en�

P��klad 5.
Posledn� verze va�eho programu by m�la po��tat ��dky souboru, kter� obsahuj� jist� �et�zec. Upravte program tak, aby po��tal ��dky, kter� obsahuj� zdvojen� p�smena nebo obecn� dva stejn� znaky t�sn� za sebou. Upravte ho pot� je�t� tak, aby nalezen� zdvojen� znak uzav�el do z�vorek. �e�en�. Vypsan� ��dka m��e vypadat nap�. takto: For example
23 Amp, James Wa(tt), 
Zkuste je�t� tuto modifikaci: v�echny zdvojen� znaky budou v z�vork�ch krom� prvn�ho zdvojen�ho znaku na ��dku.

Nakonec m��eme zkusit program modifikovar tak, aby vyhled�van� �et�zec p�eb�ral jako parametr z p��kazov�ho ��dku. P�edpokl�d�m ,�e se v� program jmenuje pocitadlo.pl. Spou�t�te jej nap�. p��kazem

perl pocitadlo.pl
Pokud program spust�te s n�kolika parametry p��kazem
perl pocitadlo.pl prvni druhy atd
jsou tyto parametry ulo�eny v poli @ARGV. Tedy v na�em p��pad� je v $ARGV[0] �et�zec prvni a v $ARGV[1] �et�zec druhy a v $ARGV[2] �et�zec atd. Upravte program tak, aby o�ek�val jeden parametr a po��tal pouze ��dky, na kter�ch se vyskytne �et�zec udan� jako parametr. �et�zec op�t vyzna�te na ��dce pou�it�m z�vorek.


Dal�� kapitola | P�edchoz� kapitola kapitola | Obsah