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

PEGASNETPEGASNET

PEGASNETPEGASNET

PEGASNETPEGASNET

PEGASNETPEGASNET