* Operatory i prioritety *
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
Termy i levostoronnie spiskovye operatory.
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".
Operatory ++ (inkrement) i -- (dekrement).
|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"
Operator ** (vozvedenie v stepen')
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".
Mul'tiplikativnye operatory.
'*' - 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.
Imenovannye unarnye operatory.
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
Operatory raboty s bitami.
'&' - pobitnoe AND
'|' - pobitnoe OR
'^' - pobitnoe XOR
Logicheskie operatory && (AND) i || (OR).
'&&' - 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.
Operator logicheskoe not (oricanie).
Unarnyj not vozvrashchaet protivopolozhnoe znachenie poluchennoe vyrazheniem
sprava. On ekvivalenten '!' no imeet ochen' nizkij prioritet.
Operator logicheskoe and (I).
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.
S operatory otsutstvuyushchie v Pel.
V Pel otsutsvuyut operatory yazyka S takie kak:
unarnoe & - poluchit' adres. Dlya etogo primenyaetsya '\'.
unarnyj * - pereadresaciya.
(TYPE) - sovmeshchenie tipov.
Operatory ogranichiteli strok.
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 );
s/shablon/podstroka/egimosx
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.
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