NAME
perlintro -- Trumpas ávadas á Perlà
DESCRIPTION
Kas yra Perl?
Perl yra bendros paskirties programavimo kalba, kuri pradþioje buvo skirta manipuliavimui tekstu, o dabar yra naudojama daugeliui uþduoèiø: sistemø administravimui, interneto svetainiø, tinklo, grafiniø sàsajø programavimui ir kitoms uþduotims.
Ði kalba yra labiau praktiðka (lengva naudoti, efektyvi, pilna) negu graþi (maþa, elegantiðka, minimalistinë). Pagrindinës Perlo ypatybës yra naudojimo paprastumas, tiek procedûrinio, tiek objektinio programavimo palaikymas, patogus teksto apdorojimas ir vienas didþiausiø nemokamø moduliø pasirinkimas.
Perlo programø vykdymas
Norint vykdyti Perlo programà Unix komandinëje eilutëje tereikia paraðyti:
perl programosvardas.pl
Arba galima paraðyti tokià pirmàjà programos eilutæ:
#!/usr/bin/env perl
... ir tada paleisti programà ðitaip:
/kelias/iki/perl/programos.pl
Tiesa, ði programa turi turëti "vykdymo" nuostatà, tad reikia Unix paraðyti
chmod 755 programa.pl
prieð jà paleidþiant.
Daugiau informacijos apie Perl interpretatoriø galima rasti perlrun dokumentacijoje.
Paprasèiausios sintaksës apþvalga
Perlo programa susideda ið vieno ar keliø sakiniø. Ðie sakiniai paprastai bûna suraðyti byloje. Prieðingai nei kai kuriose kitose kalbose, nereikia apraðyti main()
funkcijos ar panaðiø dalykø.
Perlo sakiniai baigiasi kabliataðkiu:
print "Sveikas, pasauli";
Komentarai prasideda grotelëmis ir tæsiasi iki eilutës pabaigos:
# Èia yra komentaras
Tarpai, naujos eilutës (whitespace) nieko nereiðkia:
print
"Sveikas, pasauli"
;
...nebent jie yra simboliø eilutëse:
# atspausdins "sveikas pasauli" dviejose eilutëse
print "Sveikas
pasauli";
Simboliø eilutes galima apraðyti tiek viengubomis, tiek dvigubomis kabutëmis:
print 'Sveikas, pasauli';
print "Sveikas, pasauli";
Taèiau tik dvigubose kabutëse esanèios simboliø eilutës "interpoliuoja" kintamuosius ir specialiuosius simbolius, tokius kaip naujos eilutës simbolis (\n
):
print "Sveikas, $vardas\n"; # veikia kaip derëtø
print 'Sveikas, $vardas\n'; # spausdins $vardas\n taip kaip paraðyta
Skaièiø nereikia imti á kabutes:
print 42;
Priklausomai nuo jûsø skonio, funkcijø argumentus galima raðyti skliausteliuose, o galima juos ir praleisti. Skliausteliai reikalingi tik retkarèiais norint paaiðkinti operacijø eiliðkumà.
print("Sveikas, pasauli\n");
print "Sveikas, pasauli\n";
Daugiau informacijos apie Perl sintaksæ galima rasti perlsyn dokumentacijoje.
Perlo kintamøjø tipai
Perlas turi tris pagrindinius kintamøjø tipus: skaliarus, paprastuosius masyvus bei asociatyviuosius masyvus.
Skaliarai
Skaliarai saugo vienà reikðmæ:
my $gyvunas = "kupranugaris";
my $atsakymas = 42;
Skaliarinës reikðmës gali bûti simboliø eilutës, sveiki skaièiai arba skaièiai su kableliu. Perlas automatiðkai pagal poreiká pavers vienà tipà á kità. Nebûtina prieð vartojant kintamuosius juos deklaruoti.
Skaliarus galima naudoti ávairiai:
print $gyvunas;
print "Gyvûnas yra $gyvunas\n";
print "$atsakymas pakëlus kvadratu gausime ", $atsakymas * $atsakymas, "\n";
Perle yra keletas labai neáskaitomai atrodanèiø "magiðkø" skaliariniø kintamøjø. Ðie specialûs kintamieji naudojami ávairiausiais tikslais ir visi yra apraðyti perlvar dokumentacijoje. Kol kas vienintelis toks specialus kintamasis, apie kurá vertëtø þinoti yra $_
, kuris reiðkia "kintamàjá pagal nutylëjimà". Jis naudojamas daugelyje Perlo funkcijø, jei joms neperduodami kiti kintamieji, bei automatiðkai nustatomas kai kuriuose cikluose.
print; # pagal nutylëjimà atspausdina tai kas saugoma $_
Paprastieji masyvai
Paprastuose masyvuose saugomas reikðmiø sàraðas:
my @gyvunai = ("kupranugaris", "lama", "pelëda");
my @skaiciai = (23, 42, 69);
my @maisyta = ("kupranugaris", 42, 1.23);
Masyvø indeksai prasideda nuo nulio. Ðtai kaip prieinama prie masyvo elemento:
print $gyvunai[0]; # spausdina "kupranugaris"
print $gyvunai[1]; # spausdina "lama"
Specialusis kintamasis $#masyvas
paskutinio masyvo elemento indekso numerá:
print $maisyta[$#maisyta]; # spausdina paskutiná elementà -- 1.23
Galbût jums norint suþinoti kiek yra masyve elementø norisi naudoti $#masyvas + 1
, bet tai nëra bûtina, nes naudojant @masyvas
ten kur Perlas tikisi skaliaro ("skaliariniame kontekste") bus gràþinamas masyvo elementø skaièius:
if (@gyvunai < 5) { ... } # jei masyve @gyvunai maþiau nei 5 elementai...
Norint gauti keletà reikðmiø ið masyvo:
@gyvunai[0,1]; # gràþina ("kupranugaris", "lama");
@gyvunai[0..2]; # gràþina ("kupranugaris", "lama", "pelëda");
@gyvunai[1..$#gyvunai]; # gràþina visus elementus, iðskyrus pirmà
Tai vadinama "masyvo dalimi" (array slice)
Su masyvais galima atlikti ávairius naudingus veiksmus:
my @surikiuoti = sort @gyvunai;
my @atgaline_tvarka = reverse @skaiciai;
Perle yra ir keletas specialiøjø masyvø: @ARGV
(programai perduoti komandinës eilutës argumentai), @_
(argumentai perduoti subrutinai). Visi jie apraðyti perlvar dokumentacijoje.
Asociatyvieji masyvai
Asociatyvus masyvas apraðo vardo-reikðmës porø aibæ:
my %vaisiu_spalvos = ("obuolys", "raudonas", "bananas", "geltonas");
Naudojant tarpus ir =>
operatoriø galima perraðyti áskaitomiau:
my %vaisiu_spalvos = (
obuolys => "raudonas",
bananas => "geltonas",
);
Pasiekti elementus galima taip:
$vaisiu_spalvos{"obuolys"}; # gràþina "raudonas"
Raktø bei reikðmiø sàraðus galima gauti per funkcijas keys()
ir values()
my @vaisiai = keys %vaisiu_spalvos;
my @spalvos = values %vaisiu_spalvos;
Asociatyvûs masyvai neturi kokios nors rikiavimo tvarkos, nors visada galima surikiuoti masyvà, kuris gaunamas su funkcija keys()
.
Lygiai kaip yra specialiøjø skaliarø ar paprastø masyvø, taip yra ir specialiø asociatyviø masyvø. Labiausiai naudojamas yra %ENV
specialusis asociatyvusis masyvas, kuriame saugomi aplinkos kintamieji. Apie tai plaèiau perlvar dokumentacijoje.
Plaèiau apie skaliarus, paprastus ir asociatyviuosius masyvus galima pasiskaityti perldata dokumentacijoje.
Sudëtingesnës duomenø struktûros gali bûti sudaromos naudojantis nuorodomis (references). Jø dëka galima sukurti sàraðus ir masyvus kituose sàraðuose bei masyvuose.
Nuoroda yra skaliarinë reikðmë, galinti rodyti á bet kurio tipo Perlo duomenis. Taigi, iðsaugant nuorodà á masyvà kaip kito masyvo elementà, galima sudaryti masyvø masyvus (daugiamaèius masyvus). Ðtai pavyzdys, kuriame saugoma dviejø lygiø asociatyvaus masyvo asociatyviame masyve struktûra pasinaudojus anoniminëmis nuorodomis:
my $kintamieji = {
skaliarai => {
apibudinimas => "viena reikðmë",
simbolis => '$',
},
masyvai => {
apibudinimas => "reikðmiø sàraðas",
simbolis => '@',
},
asociatyvus => {
apibudinimas => "rakto/reikðmës poros",
simbolis => '%',
},
};
print "Skaliarai prasideda simboliu ".
"$kintamieji->{'skaliarai'}->{'simbolis'}\n";
Pilna dokumentacija apie nuorodas yra perlreftut, perllol, perlref ir perldsc dokumentacijose.
Kintamøjø sritys
Kol kas visada kintamuosius apraðëme naudodami ðià sintaksæ:
my $kintamasis = "reikðmë";
Tiesà sakant, my
nëra bûtinas, galima tiesiog raðyti:
$kintamasis = "reikðmë";
Taèiau jei praleidþiate my
, sukuriamas globalusis kintamasis visoje jûsø programoje, o tai nëra pats geriausias programavimo bûdas. my
sukuria leksinës srities (lexically scoped) kintamàjá, kuris galioja tik tame bloke, kuriame jis yra apraðytas (blokas yra keletas sakiniø, apskliaustø figûriniais skliaustais).
my $a = "foo";
if ($kazkas) {
my $b = "bar";
print $a; # spausdina "foo"
print $b; # spausdina "bar"
}
print $a; # spausdina "foo"
print $b; # nieko nespausdina, nes $b galiojimo blokas jau baigësi
Jeigu naudosite my
kartu su use strict;
jûsø programos pradþioje, Perlo interpretatorius galës pastebëti daþnas programuotojø klaidas ir apie tai jus áspëti. Tarkim aukðèiau duotame pavyzdyje paskutinis print $b;
iðmestø klaidà ir programa neveiktø. Rekomenduojama visada naudoti strict
sintaksæ.
Sàlygos ir ciklø sakiniai
Perlas turi visus standartinius ciklos ir sàlygos sakinius iðskyrus case/switch
(bet jei jums tikrai jø reikia, galite pasinaudoti moduliu Switch
, kuris netgi gali daugiau nei áprasti switch/case
sakiniai kitose kalbose).
Sàlyga gali bûti bet kuris Perlo sakinys. Kitame skyriuje bus apraðomi operatoriai, tad þiûrëkite ten, kokie sàlygos, Bûlio logikos operatoriai daþnai naudojami sàlygos sakiniuose.
if
if ( sàlyga ) {
...
} elsif ( kita sàlyga ) {
...
} else {
...
}
Yra ir atvirkðtinë versija:
unless ( sàlyga ) {
...
}
... kuri reiðkia tà patá kaip ir if (!sàlyga) { ... }
, tik unless
lengviau perskaityti.
Perlo sàlygos sakiniuose figûriniai skliaustai yra bûtini, net jei yra tik vienas sakinys sàlygos bloke. Taèiau galima be to apsieiti ir iðkelti sàlygà á sakinio galà:
# tradicinis bûdas
if ( $kazkas ) {
print "aha!";
}
# labiau perliðkas bûdas:
print "aha!" if $kazkas;
print "nebëra bananø" unless $bananai;
while
while ( sàlyga ) {
...
}
Kaip ir su unless
, yra ir atvirkðtinë versija:
until ( sàlyga ) { # tas pats kaip while (!sàlyga)
...
}
while
galima permesti ir á galà:
print "la la la\n" while 1; # amþinas ciklas
for
Lygiai taip kaip ir C:
for ($i = 0; $i <= $max; $i++) {
...
}
C stiliaus for
ciklas retai naudojamas Perle, nes Perl turi draugiðkesná ir lengviau panaudojamà foreach
ciklà.
foreach
foreach (@masyvas) {
print "Masyvo elementas $_\n";
}
# nebûtina naudot $_...
foreach my $raktas (keys %hash) {
print "Rakto $raktas reikðmë yra $hash{$raktas}\n";
}
Daugiau apie ciklo sakinius (ir dar apie tuos kurie èia nepaminëti) galima rasti perlsyn dokumentacijoje.
Operatoriai ir funkcijos
Perlas turi daug standartiniø funkcijø. kai kurias jau matëme ðiame ávade (tokias kaip print
, sort
arba reverse
). Pilnas funkcijø sàraðas yra perlfunc dokumentacijoje ir apie kurià nors funkcijà lengva pasiskaityti konsolëje ávedus perldoc -f funkcijospavadinimas
.
Perlo operatoriai pilnai apraðyti perlop dokumentacijoje. Ðtai keletas daþniau sutinkamø:
Aritmetiniai:
+ sudëtis
- atimtis
* daugyba
/ dalyba
Matematinio palyginimo:
== lygybës
!= nelygybës
< maþiau negu
> daugiau negu
<= maþiau arba lygu
>= daugiau arba lygu
Simboliø eiluèiø palyginimo:
eq lygybës
ne nelygybës
lt maþiau nei
gt daugiau nei
le maþiau arba lygu
ge daugiau arba lygu
Kodël reikia skirtingø palyginimo operatoriø simboliø eilutëms ir matematinëms iðraiðkoms? Kadangi Perlas netipizuoja kintamøjø pagal tai ar tai skaièius, ar simboliø eilutë, jam reikia nurodyti ar rikiuoti matematiðkai (kur 99 yra maþiau nei 100) ar alfabetiðkai (kur 100 eina prieð 99)
Loginiai operatoriai:
&& ir
|| ar
! ne</pre>
&&
, ||
bei !
galima uþraðyti ir and
, or
, not
. Taip jie labiau áskaitomi, taèiau keièiasi pirmumo eilë. Plaèiau apie skirtumus tarp and
ir &&
galima rasti perlop dokumentacijoje.
Kiti operatoriai:
= priskyrimas
. simboliø eiluèiø sujungimas
x simboliø eiluèiø daugyba
.. intervalo operatorius (sukuria skaièiø sàraðà)
Dauguma operatoriø gali bûti derinami su =
ðitokiu bûdu:
$a += 1; # tas pats kaip $a = $a + 1;
$a -= 1; # tas pats kaip $a = $a - 1;
$a .= "\n"; # tas pats kaip $a = $a . "\n";
Bylos ir ávestis/iðvestis
Ávesèiai ar iðvesèiai bylà galima atidaryti su funkcija open()
. Pilnai su visomis detalëmis ji apraðyta perlfunc bei perlopentut dokumentacijoje, taèiau trumpai:
open(INFILE, "infile.txt") or die "Negaliu atidaryt input.txt: $!";
open(OUTFILE, ">outfile.txt") or die "Negaliu atidaryt outfile.txt: $!";
open(LOGFILE, ">>logfile.txt") or die "Negaliu atidaryt logfile.txt: $!";
Skaityti ið bylos galima naudojantis <>
operatoriø. Skaliariniame kontekste jis nuskaito vienà eilutæ ið bylos, o sàraðo kontekste gràþina ið bylos eiluèiø sudarytà masyvà:
my $eilute = <INFILE>;
my @eilutes = <INFILE>;
Visos bylos nuskaitymas ið karto vadinamas "ðliurpimu" (slurping). Tai gali bûti naudinga, bet kartu gali ir pareikalauti daug atminties resursø. Daugumà dalykø galima padaryti tekstà apdorojant po eilutæ ir naudojantis Perlo ciklais.
Operatorius <>
daþniausiai naudojamas tokiame while
cikle:
while (<INFILE>) { # priskiria kiekvienà bylos eilutæ $_
print "Kà tik perskaièiau eilutæ: $_";
}
Mes jau matëme kaip spausdinti tekstà naudojantis print()
. Taèiau print()
galima nurodyti pirmu argumentu á kurià bylà spausdinti:
print STDERR "Paskutinis perspëjimas\n";
print OUTFILE $irasas;
print LOGFILE $ivykis;
Kai baigiate dirbti su bylomis, jas reiktø uþdaryti su funkcija close()
(nors tiesà sakant, Perlas sutvarkys viskà kà pridarëte, net jei ir pamirðote uþdaryti bylà)
close INFILE;
Ápraiðkos
Perlas palaiko sudëtingà ir plaèià ápraiðkø sintaksæ. Pilnà jos apraðymà galima rasti perlrequick, perlretut ir kituose dokumentacijos skyriuose. Taèiau trumpai:
Paprastas tikrinimas
if (/foo/) { ... } # 'true' jei $_ yra simboliø seka 'foo'
if ($a =~ /foo/) { ... } # 'true' jei $a yra simboliø seka 'foo'
Ápraiðkø operatorius //
apraðytas perlop dokumentacijoje. Jis pagal nutylëjimà ápraðkà taiko kintamajam $_
, taèiau tai galima pakeisti, pasinaudojus operatoriumi =~
(kurio apraðymà irgi galima rasti perlop dokumentacijoje).
Paprastas pakeitimas
s/foo/bar/; # pakeièia 'foo' á 'bar' kintamajame $_
$a =~ s/foo/bar/; # pakeièia 'foo' á 'bar' kintamajame $a
$a =~ s/foo/bar/g; # pakeièia VISUS 'foo' á 'bar' kintamajame $a
Pakeitimo operatorius s///
apraðytas perlop dokumentacijoje.
Sudëtingesnës ápraiðkos
Ápraiðkos nebûtinai sudaromos ið pastoviø simboliø eiluèiø. Tiesà sakant, naudojantis sudëtingesnëmis ápraiðkomis galite apraðyti tokius ðablonus, kokius tik sugalvosite. Pilnai tai apraðyta perlre dokumentacijoje, o èia pateikiama tik trumpa lentelë:
. vienas bet koks simbolis
\s tarpai, naujos eilutës ir tabuliacijos simboliai (I<whitespace>)
\S ne tarpai, ne naujos eilutës ir ne tabuliacija (I<non-whitespace>)
\d skaitmuo (0-9)
\D ne skaitmuo
\w þodþiø simbolis (a-z, A-Z, 0-9 ir _)
\W ne þodþiø simbolis
[aeiou] atitinka vienà simbolá ið duotos aibës
[^aeiou] atitinka vienà simbolá ne ið duotosios aibës
(foo|bar|baz) atitinka vienà ið alternatyvø
^ eilutës pradþia
$ eilutës pabaiga
Taip pat galima nurodyti kiek kartø ápraiðka turi atitikti prieð tai nurodytà iðraiðkà, kur "iðraiðka" yra paprastas simbolis arba vienas ið metasimboliø nurodytø prieð ðià pastraipà esanèioje lentelëje.
* nulá ar daugiau kartø
+ vienà ar daugiau kartø
? nulá arba vienà kartà
{3} lygiai tris kartus
{3,6} nuo trijø iki ðeðiø kartø
{3,} tris ar daugiau kartø
Keletas trumpø pavyzdþiø:
/^\d+/ eilutë prasidedanti vienu ar daugiau skaitmenø
/^$/ tuðèia eilutë (po eilutës pradþios ið karto eina eilutës pabaiga)
/(\d\s){3}/ trys skaitmenys atskirti tarpais ar tabuliacija (tarkim "3 4 5 ")
/(a.)+/ eilutë, kurioje kiekviena neporinë raidë yra 'a' (pvz 'abacadaf')
# Ðis ciklas skaito ið STDIN ir spausdina netuðèias eilutes:
while (<>) {
next if /^$/;
print;
}
Skliausteliai
Skliausteliai naudojami ne vien tik grupavimui -- jie turi ir kità paskirtá. Jie gali bûti naudojami ápraiðkos rezultatø iðsaugojimui. Rezultatai atsiduria kintamuosiuose $1
, $2
ir taip toliau.
# pigus ir ne visai tikslus bûdas iðskaidyti el.paðto adresà á dalis:
if ($email =~ /([^@])+@(.+)/) {
print "Vartotojo vardas: $1\n";
print "Domenas: $2\n";
}
Kitos ápraiðkø galimybës
Perlo ápraiðkos dar palaiko daugybæ dalykø (backreferences, lookaheads ir t.t.) Apie visà tai galima pasiskaityti perlrequick, perlretut ir perlre dokumentacijose.
Funkcijø raðymas
Labai lengva raðytis savo funkcijas:
sub log {
my $pranesimas = shift;
print LOGBYLA $pranesimas;
}
Kà veikia tas shift
? Na, funkcijai perduodami argumentai atsiranda masyve @_
(apie tai daugiau perlvar dokumentacijoje). Jeigu shift
neperduodami jokie argumentai, ði funkcija naudoja masyvà @_
. Tad my $pranesimas = shift;
paima pirmà argumentø masyvo nará ir priskiria já kintamajam $pranesimas
.
Su @_
galima elgtis ir kitaip:
my ($pranesimas, $svarbumas) = @_; # daþnas bûdas
my $pranesimas = $_[0]; # retas ir bjaurus bûdas
Funkcijos gali gràþinti reikðmes:
sub kvadratas {
my $skaicius = shift;
my $rezultatas = $skaicius * $skaicius;
return $rezultatas;
}
Daugiau apie funkcijas perlsub dokumentacijoje
Objektinis Perlas
Objektinis Perlas yra ganëtinai paprastas. Objektai Perle yra nuorodos, kurios magiðkai þino koká objektà jos vaizduoja. Taèiau objektinis Perlas neáeina á ðá trumpà ávadà. Skaitykite perlboot, perltoot, perltooc ir perlobj dokumentacijà.
Pradedantieji Perlo programuotojai daþniausiai su objektiniu programavimu susiduria tik naudodamiesi Perlo moduliais.
Naudojimasis Perlo moduliais
Perlo moduliai leidþia jums neiðradinëti dviraèio, nes galima naudotis jau kaþkieno paraðytu kodu. Modulius galima parsisiøsti ið http://www.cpan.org . Nemaþai moduliø yra ádiegiami kartu su paèiu Perlu.
Moduliai CPAN svetainëje yra kategorizuoti. Yra daug ávairiausiø kategorijø: nuo teksto apdorojimo iki tinklo protokolø, nuo duomenø baziø iki grafikos.
Norint suþinoti kaip naudotis kuriuo nors moduliu, komandinëje eilutëje paraðykite perldoc Modulio::Pavadinimas
. Kode daþniausiai jums reikës raðyti use Modulio::Pavadinimas
-- tai ákraus moulá ir leis naudotis jo funkcijomis.
perlfaq dokumentacijoje yra daþnai uþduodami klausimai ir atsakymai apie daþnai pasitaikanèias uþduotis. Daþnai atsakymai siûlo naudotis vienu ar kitu moduliu.
perlmod dokumentacija bendrai apraðo Perlo modulius, perlmodlib dokumentacijoje yra sàraðas moduliø, kurie ádiegti kartu su Perlu.
Jeigu patys norite raðytis Perlo modulius, skaitykite perlnewmod dokumentacijà.
AUTHOR
Vertë Petras Kudaras <moxliukas@delfi.lt> Pastabos, pataisymai ir pasiûlymai labai laukiami.
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 3:
Non-ASCII character seen before =encoding in 'ávadas'. Assuming CP1252