Porovnßvßnφ °et∞zc∙


Jednou z nejv∞tÜφch v²hod Perlu (mo₧nß i nejv∞tÜφ) jsou v²konnΘ prost°edky pro manipulaci se °et∞zci. Zßkladem jsou regulßrnφ v²razy (RE), kterΘ jsou pou₧itelnΘ mnoha dalÜφmi utilitami UNIXu.


Regulßrnφ v²razy (RE)

Regulßrnφ v²razy jsou uzav°eny do lomφtek. Porovnßnφ s regulßrnφm v²razem se provßdφ pomocφ operßtoru =~.
P°φklad: Nßsledujφcφ v²raz je pravdiv², pokud se v prom∞nnΘ $sentence vyskytuje °et∞zec velka.
$sentence =~ /velka/
RE jsou case sensitive (rozliÜuje se mezi mal²mi a velk²mi pφsmeny). Pokud tedy prom∞nnß $sentence odsahuje °et∞zec
$sentence = "Velka rezata liska";
potom porovnßnφ $sentence =~ /velka/ je nepravdivΘ.

Operßtor !~ je pou₧φvßn k testovßnφ nerovnosti. Pokud tedy prom∞nnß $sentence odsahuje °et∞zec

$sentence = "Velka rezata liska";
je v²raz $sentence !~ /velka/ pravdiv², proto₧e °et∞zec velka se nevyskytuje v prom∞nnΘ $sentence.


Specißlnφ prom∞nnß $_

Regulßrnφ v²raz m∙₧eme pou₧φt v podmφn∞nΘm p°φkazu
if ($sentence =~ /under/)
{
	print "We're talking about rugby\n";
}
Blok p°φkaz∙ bude vypisovat zprßvu, pokud bude obsah prom∞nnΘ $sentence nap°.
$sentence = "Up and under";
$sentence = "Best winkles in Sunderland";
Postup je jednoduÜÜφ, pokud p°i°adφme °et∞zec prom∞nnΘ se jmΘnem $_. Prom∞nnß $_ je skalßrnφ prom∞nnß. Pokud tak uΦinφme, nemusφme pou₧φvat srovnßvacφ operßtory a m∙₧eme jednoduÜÜe zapsat
if (/under/)
{
	print "We're talking about rugby\n";
}
Prom∞nnß $_ je implicitnφ pro mnohΘ operace Perlu a pou₧φvß se velice Φasto.


Vφce o RE

V RE se pou₧φvß mnoho specißlnφch znak∙. Prßv∞ tyto specißlnφ znaky d∞lajφ z RE silnΘ prost°edky, ale takΘ zp∙sobujφ, ₧e RE vypadajφ na pohled komplikovan∞.

RE je vhodnΘ zaΦφt pou₧φvat postupn∞, jejich vytvß°enφ je Φasto urΦit²m druhem um∞nφ.

Uvedeme n∞kterΘ specißlnφ znaky pou₧φvanΘ v RE a jejich v²znam

.	# libovoln² znak, krom∞ znaku pro nov² °ßdek
^	# zaΦßtek °ßdky nebo °et∞zce
$	# konec °ßdky nebo °et∞zce
*	# ₧ßdn² nebo n∞kolik v²skyt∙ p°edchozφho znaku
+	# jeden nebo n∞kolik v²skyt∙ p°edchozφho znaku
?	# ₧ßdn² nebo jeden v²skyt poslednφho znaku
a p°φklady pou₧itφ porovnßnφ. P°ipome≥me, ₧e v²razy RE musφ b²t uzav°eny do lomφtek (/.../).
t.e	# v²raz p°edstavuje °et∞zec zaΦφnajφcφ t nßsledovanΘ Φφmkoli (alespo≥ 
          jednφm znakem) a konΦφcφ pφsmenem e
	# Vyhovuje nap°.:       the
	#                       tre
	#                       tle
	# ale nevyhovuje        te
	#                       tale
^f	# f na zaΦßtku °ßdky
^ftp	# ftp na zaΦßtku °ßdky
e$	# e na konci °ßdky
tle$	# tle na konci °ßdky
und*	# un nßsledovanΘ ₧ßdn²m nebo vφce znaky d
	# vyhovuje  nap°.      un
	#                      und
	#                      undd
	#                      unddd (atd)
.*	# libovoln² °et∞zec bez znak∙ nov² °ßdek. Proto₧e
	#  . vyhovuje libovolnΘmu znaku krom∞ novΘho °ßdku a
	# * znamenß ₧ßdn² nebo vφce v²skyt∙ poslednφho znaku.
^$	# °ßdek s prßzdn²m obsahem.

Existujφ dalÜφ mo₧nosti.
Pro porovnßnφ se skupinou znak∙ se pou₧φvajφ hranatΘ zßvorky. Porovnßnφ se provßdφ na libovoln² znak uvnit° zßvorek. PomlΦka (-) uvnit° hranat²ch zßvorek oznaΦuje znaky mezi uveden²mi znaky a znak ^ na zaΦßtku zßvorky znamenß negaci:

[qjk]		# q nebo j nebo k
[^qjk]		# ani j ani g ani k
[a-z]		# cokoli od a do z vΦetn∞ znak∙ a a z
[^a-z]		# nikoli malß pφsmena
[a-zA-Z]	# libovolnΘ pφsmeno
[a-z]+		# libovoln² neprßzdn² °et∞zec z mal²ch pφsmen
V tomto bod∞ m∙₧ete p°eskoΦit na p°φklady, zbytek kapitoly je uveden² jako referΦnφ seznam.

Vertikßlnφ Φßra | znamenß "or" a kulatΘ zßvorky (...) je mo₧nΘ pou₧φt k seskupovßnφ:

nanuk|zmrzlina	# nanuk nebo zmrzlina
(m|d)rak	# mrak nebo drak
(da)+		# da nebo dada nebo dadada nebo ..

N∞kterΘ specißlnφ znaky:

\n		# nov² °ßdek
\t		# tabelßtor
\w		# libovoln² alfanumerick² znak,
		# \w je ekvivalentnφ s [a-zA-Z0-9_]
\W		# libovoln² nealfanumerick² znak,
		# \W je ekvivalentnφ s [^a-zA-Z0-9_]
\d		# libovolnß Φφslice, tj. [0-9]
\D		# znak jin² ne₧ Φφslice, tj. [^0-9]
\s		# znak pro vlo₧enΘ mezery, tj. mezera,
		# tab, nov² °ßdek, atd.
\S		# nemezerov² znak
\b		# hranice slova, tento znak nelze pou₧φt uvnit° []
\B		# na uvedenΘm mφst∞ nenφ hranice slova

Znaky jako $, |, [, ), \, / a majφ v RE zvlßÜtnφ v²znam. Pokud chcete porovnßvat na v²skyt n∞kterΘho z t∞chto znak∙, musφte p°ed nimi uvΘst zp∞tnΘ lomφtko. Tj:

\|		# svislß Φßra
\[		# ·vodnφ hranatß zßvorka
\)		# koncovß zßvorka
\*		# hv∞zdiΦka
\^		# st°φÜka
\/		# lomφtko
\\		# zp∞tnΘ lomφtko
atd.


P°φklady RE

Jak bylo uvedeno v²Üe ja lepÜφ zaΦφt pou₧φvat RE postupn∞ a pomalu. Uve∩me n∞kolik p°φklad∙. p°ipome≥me, ₧e p°i pou₧itφ ve srovnßnφ musφ b²t RE uzav°eny v lomφtkßch /.../.
[01]		#  "0" nebo "1"
\/0		#  d∞lenφ nulou "/0"
\/ 0		#  d∞lenφ nulou s mezerou "/ 0"
\/\s0		# d∞lenφ nulou s mezerov²m znakem
		# "/ 0" kde mezerov² znak m∙₧e b²t tabelßtor atd.
\/ *0		# d∞lenφ nulou s mo₧n²mi mezerami
		#  "/0" nebo "/ 0" nebo "/  0" atd.
\/\s*0		# d∞lenφ nulou s mo₧n²mi mezerov²mi znaky
		# 
\/\s*0\.0*	# jako p°edchozφ v²raz, ale s desetinou teΦkou a mo₧n²mi    
		# nulami za teΦkou. Vyhovuje
		# "/0." a "/0.0" a "/0.00" atd a
		# "/ 0." a "/  0.0" a "/   0.00" atd.

if (/(\w*)@([a-z\.]+)/)   # kontrola, zda v prom∞nnΘ $_ je 
{                         # ulo₧ena e-mail adresa
  $uzivatel=$1;
  $domena=$2;
} 


CviΦenφ

P°φklad 4. P°edchozφ verze programu poΦφtala pouze neprßzdnΘ °ßdky. Pozm∞≥te program tak, aby poΦφtal pouze °ßdky, kterΘ obsahujφ V ka₧dΘm p°φpad∞ mß program opisovat vÜechny °ßdky, ale poΦφtat musφ jen ty, kterΘ obsahujφ uveden² znak nebo °et∞zec. Zkuste pou₧φt prom∞nnou $_ a tφm zjednoduÜit zßpis. R∞Üenφ.


DalÜφ kapitola | P°edchozφ kapitola kapitola | Obsah

PEGASNETPEGASNET

PEGASNETPEGASNET

PEGASNETPEGASNET

PEGASNETPEGASNET