Ocenite etot tekst:


     V   Pel   associativnost'   i   prioritetnost'  operatorov
analogichna  yazyk  Nizhe  perechisleny  vse  operatory  v  poryadke
umen'sheniya prioriteta, v nachale stroki ukazana associativnost'.

	assoc.	    operatory
	-----	---------------------------
	levaya	termy i levostoronnye spiskovye operatory
	levaya	->
	 -	++ --
	pravaya	**
	pravaya	! ~ \ unarnye + i -
	levaya	=~ !~
	levaya	* / % x
	levaya	+ - .
	levaya	<< >>
	  -	imenovannye unarnye operatory
	  -	< > <= >= lt gt le ge
	  -	== != <=> eq ne cmp
	levaya	&
	levaya	| ^
	levaya	&&
	levaya	||
	  -	..
	pravaya	?:
	pravaya	= += -= *= i t.d.
	levaya	, =>
	  -	pravostoronnie spiskovye operatory
	levaya	not
	levaya	and
	levaya	or xor




Lyuboj term imeet samyj vysokij prioritet. K termu otnosyatsya
peremennye, kavychki i ih operatory, arifmeticheskie i logicheskie vyrazheniya
v skobkah, lyubye funkcii s parametrami v skobkah. Fakticheski takih
funkcij net tak kak eto prosto unarnye i spiskovye operatory prosto
oni vedut sebya podobno funkciyam s parametrami v skobkah. Podrobno smotri
glavu "Funkcii".
Esli posle lyubogo spikovogo operatora ( print(), i t.d.) ili unarnogo
operatora (chdir(), i t.d.) sleduet levaya kruglaya skobka, to operatory
vnutri skobok imeyut naivysshij prioritet. Tak zhe kak i obychnye funkcii.

Esli skobki otsutsvuyut to prioritet spiskovyh operatorov ili naivysshij
ili naimen'shij v otnoshenii operatorov sprava ili sleva ot nego.

Naprimer:

        @i = ('a ','b ', print 'c ', 'd ');
        print "\n",@i,"\n";

Rezul'tat:
	c d
	a b 1

Zdes' my imeem spiskovyj operator print. Dlya zapyatyh sleva ot nego on
imeet naimen'shij prioritet, no povyshaet prioritet pravoj zapyatoj.
Poetomu pravaya zapyataya vosprinimaetsya kak parametr dlya print i pechataetsya
'c d' a levaya prosto zapisyvaet kod zaversheniya operacii v massiv @i
i poslednij print pokazyvaet eto.



Tak zhe kak v S ili S++ eto infiksnyj operator pereadressacii. Esli
sprava ot nego stoit [...] ili {...} vyrazhenie, to pravaya chast' mozhet
byt' neposredstvennoj ili simvolicheskoj ssylkoj na massiv ili hesh.
V protivnom sluchae pravaya storona eto metod ili prostoj skalyar soderzhashchij
imya metoda, a pravaya ili ob®ekt ili imya klassa. Podrobno smotri
glavu "Klassy".



|ti operatory rabotayut tak zhe kak i v S. Esli operator stoit pered
peremennoj to znachenie peremennoj izmenyaetsya na 1 i poluchennoj znachenie
ispol'zuetsya. Esli posle peremennoj to ee velichina izmenyaetsya posle
primeneniya.

Upotreblenie inkrementa k strokovym peremennym v Pel imeet odnu osobennost'.
Kazhdyj simvol ostaetsya v svoem klasse (bol'shie, malye, cifry) i uchityvaetsya
perenos predydushchego simvola. Takim obrazom strokovye peremennye s ciframi
rabotayut kak chislovye peremennye.

Primer:
	print ++($i = "09");	# Rezul'tat "10"

	print ++($i = "a9");	# "b0"

	print ++($i = "az");	# "ba"

	print ++($i = "aZ");	# "bA"



Primer:
	print 4**2	# Rezul'tat 16

	print -4**2	# Rezul'tat -16 t.e. -(4**2)



	'!'	- logicheskoe otricanie

	'-'	- arifmeticheskij minus

	'~'	- pobitnaya inversiya (dopolnenie do 1)

	'+'	- arifmeticheskij plyus

	'\'	- poluchenie ssylki na peremennuyu (kak & v S)

Operatory "privyazki" =~ i != .

|ti "neobychnye" ya by dazhe skazal original'nye operatory imeyut
ochen' shirokoe primenenie v Pel. Mozhno dazhe nazvat' ih "original'nym"
resheniem. Operator =~ logicheski svyazyvaet levuyu chast' vyrazheniya
s paternom (pattern - obrazec, shablon, model') v pravoj.
Po umolchaniyu poisk ili izmenenie po paternu vypolnyaetsya v peremennoj $_
Operatory privyazki pozvolyayut delat' eto s lyuboj peremennoj ukazannoj
v levoj chasti. Logicheskim rezul'tatom budet uspeh operacii.
Esli v pravoj chasti vmesto paterna prisutsvuet vyrazhenie, to
rezul'tat etogo vyrazheniya vosprinimaetsya kak patern. Odnako eto
ne ochen' effektivno t.k. patern budet kompilirovat'sya vo vremya
ispolneniya programmy chto zametno snizit bystrodejstvie.
Operator != analogichen =~ tol'ko rezul'tat sovpadeniya inventiruetsya
(logicheskoe "net"). Podrobnoe primenenie etih operatorov privoditsya
v glave "Paterny".



	'*'	- arifmeticheskoe umnozhenie

	'/'	- arifmeticheskoe delenie

	'%'	- arifmeticheskij modul'

	'x'	- operator povtoreniya
V skalyarnom kontekste vozvrashchaet stroku levoj chasti povtorennuyu velichinoj
ukazannoj v pravoj chasti. V spiskovom kontekste, esli v levoj chasti spisok
v kruglyh skobkah - povtorennyj spisok.

Primer:
	print '*' x 5;	# Rezul'tat '*****'

	print (1,2) x 3; # Rezul'tat 121212




	'+'	- arifmeticheskij plyus

	'-'	- arifmeticheskij minus

	'.'	- konkatenaciya (ob®edinenie) strok



	'<<'	- Sdvigaet pobitno vlevo znachenie vyrazheniya v levoj chasti
		na kolichestvo bit ukazannoe v pravoj.

	'>>'	- Sdvigaet pobitno vpravo znachenie vyrazheniya v levoj chasti
		na kolichestvo bit ukazannoe v pravoj.



Fakticheski eto funkcii s odnim argumentom. Kruglye skobki mozhno opuskat'.



	'<'	- arifmeticheskoe men'she

	'>'	- arifmeticheskoe bol'she

	'<='	- arifmeticheskoe men'she ili ravno

	'>='	- arifmeticheskoe bol'she ili ravno

	'lt'	- strokovoe men'she

	'gt'	- strokovoe bol'she

	'le'	- strokovoe men'she ili ravno

	'ge'	- strokovoe bol'she ili ravno



	'=='	rezul'tat true esli levaya chast' ravna pravoj (ravno)

	'!='	- ne ravno

	'<=>'	- -1 esli levaya chast' men'she pravoj, 0 esli ravna,
		1 esli bol'she.

	'eq'	- strokovoe ravno

	'ne'	- strokovoe ne ravno

	'cmp'	- kak i '<=>' primenitel'no k strokam



	'&'	- pobitnoe AND

	'|'	- pobitnoe OR

	'^'	- pobitnoe XOR



	'&&'	- esli levoe vyrazhenie vozvrashchaet false, pravoe ne vypolnyaetsya.

	'||'	- esli levoe vyrazhenie vozvrashchaet true, pravoe ne vypolnyaetsya.

Otlichie ot podobnyh operatorov v S zaklyuchaetsya v tom, chto v S vozrashchaemoe
znachenie libo 0 libo 1. Togda kak v Pel vozvrashchaetsya rezul'tat vyrazheniya.



     Rezul'tat raboty dannogo operatora zavisit ot konteksta. V
spiskovom kontekste rezul'tat est' spisok s elementami.  Pervyj
element  kotorogo  eto  levoe  vyrazhenie  i poslednee - pravoe.
Znachenie kazhdogo elementa vnutri  spiska  uvelichivaetsya  na  1.
Dannyj   operator  udoben  dlya  nebol'shih  ciklov  t.k.  pamyat'
otvoditsya dlya vsego spiska celikom. Poetomu bud'te  vnimatel'ny
i ne zadavajte slishkom bol'shoj diappazon.
 Primer:
	for $i (1..4)
	   { print "$i ";
	   }
Rezul'tat: 1 2 3 4

V skalyarnom kontekste rezul'tat - logicheskoe znachenie. Kazhdaya '..'
operaciya ustanavlivaet svoe sobstvennoe sostoyanie. |to false
do teh por poka levyj operand false. Kak tol'ko levyj operand
stal true rezul'tat - true do teh poka pravyj true, posle chego
rezul'tat opyat' - false. Esli vy ne hotite proveryat' pravyj operand
to ispol'zujte operator '...'.
Pravyj operand ne vychislyaetsya poka rezul'tat false i  levyj
operand ne vychislyaetsya poka poka rezul'tat true. Prioritetnost'
operatora '..' nemnogo nizhe chem '&&' i '||'. Vozvrashchaemoe
znachenie esli flase - nulevaya stroka, esli true - poryadkovyj nomer
nachinaya s 1. Poryadkovyj nomer obnulyaetsya dlya kazhdogo novogo diappazona.
Poslednij poryadkovyj nomer dobavlyaetsya strokoj "E0" kotoraya ne izmenyaet
ego znachenie no pozvolyaet fiksirovat' poslednee znachenie.

Primer:
	@alfavit = ('a'..'z'); # Massiv malyh bukv latinskogo alfavita

	@cifry = (0..9);	# Massiv cifr

Uslovnyj operator '?:'

|tot operator rabotaet tak zhe kak i v S. Esli vyrazhenie pered '?'
istinno to vypolnyaetsya argument pered ':' - inache posle ':'.

Primer:
	$i = 1;
	$i > 1 ? print "bol'she" : print "men'she";

Rezul'tat: men'she



	'='	- obychnyj operator "prisvoit'" pravoe znachenie peremennoj sleva
Vsya eta gruppa operatorov podobna operatoram S t.e.

	$i += 2;
ekvivalentno
	$i = $i + 2;
Ostal'nye operatory etoj gruppy rabotayut analogichno.
Dopustimy sleduyushchie operatory:

	**=
	+=	-=	.=
	*=	/=	%=	x=
	&=	|=	^=
	<<=	>>=
	&&=	||=

Prioritet vsej etoj gruppy operatorov raven prioritetu '='.




V skalyarnom kontekste vypolnyaetsya levyj argument, rezul'tat ignoriruetsya
zatem pravyj i ego rezul'tat est' rezul'tat dejstviya operatora.
V spiskovom kontekste eto razdelitel' elementov spiska kotoryj
vklyuchaet ukazannye elementy v spisok.



Unarnyj not vozvrashchaet protivopolozhnoe znachenie poluchennoe vyrazheniem
sprava. On ekvivalenten '!' no imeet ochen' nizkij prioritet.



Vypolnyaet logicheskuyu kon®yunkciyu dvuh vyrazhenij. |kvivalenten '&&'
no imeet ochen' nizkij prioritet i "kratkost'" dejstviya. t.e
esli levoe vyrazhenie ravno false - levoe ne vypolnyaetsya.



Vypolnyaet logicheskuyu diz®yunkciyu dvuh vyrazhenij. |kvivalenten '||'
no imeet ochen' nizkij prioritet i "kratkost'" dejstviya. t.e
esli levoe vyrazhenie ravno true - levoe ne vypolnyaetsya.

Logicheskoe xor (isklyuchayushchee ILI).
Vypolnyaet logicheskoe isklyuchayushchie ili. Vsegda vypolnyayutsya oba
pravoe i levoe vyrazhenie.


 V Pel otsutsvuyut operatory yazyka S takie kak:
	unarnoe &	- poluchit' adres. Dlya etogo primenyaetsya '\'.

	unarnyj *	- pereadresaciya.

	(TYPE)		- sovmeshchenie tipov.




Obychno ogranichiteli strok my schitaem literalami, no v Pel eto operatory
vypolnyayushchie raznogo roda interpolyaciyu i poisk po shablonu. Vy mozhete
sami zadavat' udobnye dlya vas ogranichiteli. V sleduyushchej tablice
priveden polnyj perechen' variantov. Figurnye skobki '{}' oboznachayut
lyuboj simvol ispol'zuemyj dlya ogranichitelya. V sluchae ispol'zovaniya
skobok (kruglyh '()', kvadratnyh '[]', figurnyh '{}', uglovyh '<>')
v nachale stavitsya otkryvayushchayasya skobka a v konce zakryvayushchaya.

  Po umolchaniyu	Polnoe	Funkciya     Interpolyaciya
   ----------	------	------------	----
	''	q{}	Literal		net
	""	qq{}	Literal		da
	``	qx{}	Komanda		da
		qw{}	Spisok slov	net
	//	m{}	SHablon		da
		s{}{}	Podstanovka	da
		tr{}{}	Translyaciya	net

V strokah dopuskayushchih interpolyaciyu imena peremennyh nachinayushchiesya s
simvolov '$' ili '@' - interpoliruyutsya t.e. v stroku vstavlyaetsya
znachenie stroki ili massiva.
Dannye posledovatel'nosti simvolov imeyut special'noe znachenie:

	\t	simvol tabulyacii
	\n	simvol novoj stroki
	\r	vozvrat
	\f	perevod formata
	\v	vertikal'naya tabulyaciya
	\b	backspace (zaboj)
	\a	zvonok
	\e	escape
	\034	vos'merichnyj simvol
	\x1a	shest'nadcaterichnyj simvol
	\c[	simvol upravleniya
	\l	nizhnij registr sleduyushchego simvola
	\u	verhnij registr sleduyushchego simvola
	\L	nizhnij registr dlya vseh simvolov do \E
	\U	verhnij registr dlya vseh simvolov do \E
	\E	ogranichitel' smeny registra
	\Q	otmena dejstviya metasimvolov do \E

SHablony interpoliruyutsya kak regulyarnye vyrazheniya. |to vypolnyaetsya
vtorym prohodom posle interpolyacii peremennyh poetomu
v shablony mozhno vstavlyat' peremennye. Dlya otmeny interpolyacii
ispol'zujte '\Q'. Esli vy primenyaete vlozhennye ogranichiteli to
vnutrennie ogranichiteli rabotat' ne budut.


Dejstvie etogo operatora analogichno /shablon/ no vypolnyaetsya
do pervogo sovpadeniya. |to udobno dlya poiska nalichiya kakoj
nibud' stroki v odnom ili mnozhestve fajlov. |to ne ochen'
udachnyj operator poetomu v sleduyushchih versiyah Pel ego
vozmozhno ne budet.


/PATERN/gimosx
Poisk v stroke po paternu (shablonu). V skalyarnom kontekste vozvrashchaet
logicheskoe znachenie true (1) ili false (''). Esli stroka ne ukazana
s pomoshch'yu operatorov '=~' ili '!~' poisk vedetsya v stroke $_

Opcii:
	g	- Global'nyj poisk. Poisk vseh vhozhdenij.
	i	- Sravnenie ne zavisit ot registra (verhnij ili nizhnij)
	m	- Stroka mnogostrochna.
	o	- odnoprohodnaya kompilyaciya
	s	- odnostrochnaya stroka
	x	- ispol'zueyutsya rasshirennye regulyarnye vyrazheniya.

Esli '/' - ogranichitel' to nachal'noe 'm' mozhno opustit'. S pomoshch'yu
nego v kachestve ogranichitelya mozhet byt' lyuboj simvol krome probela.

PATTERN mozhet soderzhat' peremennye kotorye budut interpolirovat'sya
(perekompilirovat'sya) kazhdyj raz v moment vychisleniya.
Peremennye $) i $| ne interpoliruyutsya. Esli vy hotite chto by
takoj shablon interpolirovalsya odin raz - dobav'te /o.
|to neobhodimo delat' v ciklah poiska dlya uvelicheniya bystrodejstviya
odnako esli vy izmenite znachenie peremennoj Pel etogo dazhe ne zametit.

Esli PATERN - nulevaya stroka to ispol'zuetsya poslednee regulyarnoe
vyrazhenie.

V skalyarnom kontekste vozvrashchaetsya spisok elementy kotorogo
rezul'taty vypolneniya vyrazhenij v skobkah paterna ($1, $2, $3...).
Obratite vnimanie chto pervyj element $1.

Primer:
	$a = "/usr/local/perl/perl.bin"; # Analiziruemaya stroka

Cel':	Sozdat' massiv @dirs s imenami direktorij.

Reshenie:
	Samyj prostoj sposob vospol'zovat'sya split('\/')
	no v kachestve primera ispol'zuem skobki.

	@dirs =~ m[/(\w*)/(\w*)/(\w*)/(\w*)]

Zdes' 'm[' - ispol'zovat' kvadratnye skobki kak ogranichiteli.
(\w*)	- shablon alfavitnocifrovoj posledovatel'nosti.

V rezul'tate @dirs raven ('usr', 'local', 'perl')


'stroka'
	Stroka literalov. Ne interpoliruetsya. Vnutri stroki razreshaetsya ispol'zovat'
\' ili \\ dlya oboznacheniya simvolov ' i \ .

Primer:
	print q#Privet.#;	# Rezul'tat Privet.

	print 'O\'K';		# O'K

qq/stroka/
"stroka"
	Interpoliruemaya stroka.

Primer:
	$var = 13;
	print "\$var = $var";

Rezul'tat:
	$var = 13


`stroka`
	Snachalo stroka interpoliruetsya a potom vypolnyaetsya kak
	sistemnaya komanda.

Primer:
	print `date`;

Rezul'tat:
	Thu Nov 14 13:36:49 MSK 1996


	Vozvrashchaet spisok elementy kotorogo - slova stroki razdelennye
	probelami.

Primer:
	print qw/Postroemsya i spasemsya!/; # ('Postroemsya','i','spasemsya!')

Rezul'tat:
	Postroemsyaispasemsya!

CHasto primenyaetsya kak:
	use POSIX qw( setlocale localeconv )
	@EXPORT = qw( proc1 var );


	Poisk po shablonu i v sluchae uspeha zamena podstrokoj.
	Vozvrashchaet kolichestvo proizvedennyh podstanovok inache false (0).
Esli stroka v kotoroj vedestya poisk ne ukazana (operatory =~ ili != )
to ispol'zuetsya peremennaya $_ .
Esli v kachestve radelitelya '/' isrol'zovat' odinarnuyu kavychku (')
to interpolyacii ne budet inache mozhno primenyat' peremennye v shablone
ili podstroke.

Opcii:

	e	- Rasmmatrivat' pravuyu chast' kak vyrazhenie.
	g	- Global'nyj poisk.
	i	- Bez razlichiya registra bukv
	m	- mnogostochnaya peremennaya
	o	- kompilirovat' shablon odin raz
	s	- odnostrochnaya peremennaya
	x	- rasshirennoe regulyarnoe vyrazhenie

Razdelitel' '/' mozhno zamenit' na lyuboj alfavitno-cifrovoj simvol
krome probela.

Primer:
	$var = "12345"; # ishodnaya stroka
	$var =~ s/1/0/; # Zamenit' '1' na '0'. Rezul'tat 02345
	$var =~ s(5)(.); # Zamenit' '5' na '.' Rezul'tat 0234.

Zdes' v kachestve razdelitelya primeneny skobki poetomu podstroka
vzyata v dve skobki.

	$var =~ s/\d*/kalambur/; Zamenit' vse cifry. Rezul'tat 'kalambur.'

	$var =~ s/a/o/g; # Zamenit' vse 'a' na 'o'. Rezul'tat 'kolombur.'

	$var = "12 34"; # Novoe znachenie

	$var =~ s/(\d\d) (\d\d)/$2 $1/; # Pomenyat' mestami chisla. Rezul'tat '34 12'.



y/tablica1/tablica2/cds

	Zamena vseh simvolov iz "tablica1" na sootvetsvuyushchij simvol
iz "tablica2". Rezul'tat - kolichestvo zamen ili stiranij. Bez operatora
=~ ili != operaciya vypolnyaetsya s strokoj $_. Dlya sovmestimosti s programmoj
sed vmesto tr mozhno pisat' 'y'.

Opcii:
	c	- dopolnenie "tablica1"
	d	- steret' najdennye no ne zamenennye simvoly.
	s	- "zzhat'" povtoryayushchiesya zamenennye simvoly.

Esli ukazana opciya /d tablica2 vsegda interpretiruetsya kak polozheno.
Drugimi slovami esli tablica2 koroche chem tablica1 to simvol iz tablicy1
interpretiruetsya vsegda. Esli tablica2 - null to vse simvoly stroki
ostayutsya ne izmennennye. |to udobno dlya podscheta kolichestva sivolov
v stroke opredelennogo klassa ili dlya szhatiya povtoryayushchihsya simvolov
naprimer probelov.

Primer:
	$s = "hello";	# Ishodnaya stroka

	$s =~ tr/a-z/A-Z/;	# Zamenit' malye bukvy na bol'shie. Rezul'tat
				# 'HELLO'

	$s = 'Hel....lo';
	$s =~ tr/a-zA-z/_/c;	# Zamenit' vse ne bukvy na '_'
				# Rezul'tat 'Hel____lo'
	$s =~ tr/_/ /s;		# Zamenit' '_' na ' ' i szhat'.
				# Rezul'tat 'Hel lo'
	$s =~ tr/a-zA-Z /a-zA-Z/d; # Udalit' vse ne bukvy. Rezul'tat 'Hello'

Esli odin i tot zhe simvol neskol'ko raz ukazan v tablice1 to primenyaetsya
tol'ko pervaya zamena.




V Pel sushchestvuet neskol'ko operatorov vvoda-vyvoda. Pervyj eto skobki
iz simvola '`' - akcenta. Stroka v etih skobkah vosprinimaetsya kak
sistemnaya komanda i rezul'tat ee dejstviya vozvrashchaetsya kak "psevdo"
literal. V skalyarnom kontekste eto stroka soderzhashchaya ves' rezul'tat,
a v spiskovom - spisok elementy kotorogo - stroki rezul'tata.
Status vypolnenoj komandy hranitsya v peremennoj $? .

Sleduyushchaya komanda vvoda vyvoda vygledit kak ''.
Vychislenie  privodit k chteniyu stroki iz fajla. Obratite vnimanie
chto 'fajl' zdes' ne imya fajla a ukazatel' fajla kotoryj sozdaetsya
funkciej open(). V skalyarnom kontekste chitaetsya odna stroka vmeste
s simvolom '\n' - perevoda stroki, a v spiskovom ves' fajl chitaetsya
v spisok elementy kotorogo sut' stroki fajla.
V sluchae obnaruzheniya konca fajla rezul'tat operatora ne opredelen
i vosprinimaetsya kak false. Esli ne ukazana peremennaya rezul'tata
to po umolchaniyu eto $_. Ukazatel' fajla po umolchaniyu STDIN -
standartnyj vvod.

Primer:
	while(<>) { print; }; # Prochitat' i vyvesti ves' fajl STDIN

U operatora '<>' est' odna otlichitel'naya osobennost'. Esli v komandnoj
stroke net nikakih argumentov to chitaetsya standartnyj vvod, esli
est' argumenty to oni schitayutsya imenami fajlov kotorye posledovatel'no
chitayutsya.
Esli v uglovyh skobkah zapisana peremennaya to soderzhimoe etoj
peremennoj schitaetsya imenem ukazatelya fajla ili ssylkoj na
ukazatel' fajla. Esli takogo ukazatelya ne sushchestvuet to soderzhimoe
peremennoj vosprinimaetsya kak shablon imen fajlov i rezul'tat
- imena fajlov na diske podhodyashchih po shablonu.

Primer:
	while(<*.pl>) { print;}; # To zhe chto i ls *.pl

	@files = <*>;	# Massiv @files soderzhit imena fajlov v direktorii

no luchshe sdelat': @files = glob("*"); t.k. vnutri skobok mozhno ispol'zovat'
peremennye.


    Sliyanie konstant.

Kak i S Pel vypolnyaet vozmozhnye vychisleniya v period kompilyacii. Tak podstanovka simvolov posle '\' , operaciya konkatenacii strok, arifmeticheskie vyrazheniya soderzhashchie tol'ko odni konstanty, vse eto delaetsya v moment kompilyacii chto sushchestvenno uvelichivaet skorost' vypolneniya programmy.

    Celochislennaya arifmetika.

Po umolchaniyu Pel vypolnyaet arifmetiku s plavayushchej zapyatoj, no esli vy ukazhete: use integer; to kompilyator budet ispol'zovat' celochislennuyu arifmetiku do konca tekushchego bloka, hotya vlozhennyj blok mozhet eto i otmenit' v svoih predelah s pomoshch'yu: no integer;

Last-modified: Thu, 24 Apr 1997 18:01:40 GMT
Ocenite etot tekst: