Dar vieno analitiko svetainė

Petras Kudaras

Įvadas į Perl: pirma dalis: sintaksė ir kintamieji

Kažkada praeitą savaitę buvau pradėjęs versti perlintro dokumentaciją, bet kol kas to nesu baigęs daryti. Na, gal kam bus naudinga ir tai ką jau esu padaręs, tad štai pirmoji įvado į perl dalis ;)

Kas yra Perl?

Perl yra bendros paskirties programavimo kalba, kuri pradžioje buvo skirta teksto manipuliavimui, 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ų paleidimas

Norint paleisti Perlo programą iš Unix komandinės eilutės 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žinot 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 daryti įvairių naudingų dalykų:

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.