Išleistas Perl 5.8.1 RC1

Atrodo, kad ką tik išleistas Perl
5.8.1 RC1
. perldelta
dokumentacijoje matosi keletas pakeitimų. Vienas svarbiausių pakeitimų
yra asociatyviųjų masyvų atsitiktinės tvarkos pagerinimo algoritmas (ten
BugTraq berods rašė jog galima padaryt DOS ataką prieš programą,
nes kol kas dauguma asociatyviųjų masyvų ne visai atsitiktiniu būdu
sudaro masyvo raktų eilę – sudėtingas tas bugas, tik žinau kad
egzistuoja beveik visose kalbose ir programose ir kad gali dėl to gautis
Denial of Service, nors atrodo tik teoriniam lygyje)

Taipogi keletas pakeitimų su utf-8 pragma ir
-C raktu – vėlgi pagerintas
internacionalizacijos palaikymas. be to galima dabar
pritie’int masyvus su neigiamais indeksais, lokalizuotis
kintamuosius naudojant netiesioginę sintaksę (local ${$x};
local @{$x};
), atsisakyta pseudo-hešų, 5.5 perlo stiliaus
threadų, magiško kintamojo $*.

Dabar vietoj perl -MCPAN -e shell galima rašyti
tiesiog cpan. Benchmark modulis
gali automatiškai naudotis moduliu Time::HiRes
(tikslesnis laiko matavimas), šiek tiek pagerintas Perlo debugeris
(mmm… nuvabalintojas? nuriktintojas? :)

Na ir šiaip daug visokių pagerinimų. Teks laukti 5.8.1.

Įvadas į Perl: trečioji dalis: operatoriai ir I/O

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

&&, || 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
whilecikle:

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;

Darbai, darbai…

Jau galvojau, kad baigsis Dainų šventė tai bus kada atsikvėpt.
Pasirodo užgriūva nauji projektai, kurie beje susiję labiau su mano
darbu (internetas, programavimas, adminavimas ir pan.)

Per pastarąsias dienas baiginėju verst perlintro – nėra
ten tiek daug, bet visi laiko neturi, tame tarpe ir aš pats, tad gaunasi
viskas lėtai. Na tikiuosi ryt poryt papostint paskutines „įvado į
Perl“ dalis.

Kas svarbiausia šablonų varikliams

Nuskaičiau šiandien PHP forume įdomią diskusiją apie tai kas svarbiausia PHP šablonų varikliuose (ačiū scooox už nuorodą). Labiausiai prieštaringų minčių man sukėlė citata O jei template nera svarbiausia greitis... tai kas tada svarbu? Navarotai? Jei taip – tada tu grybas. Tiesą sakant „navarotai“ yra labai svarbu. Ir turbūt svarbiausia (na, jei greitis nėra visiškai šliaužiantis). Gyvename tokiais laikais kai kompiuterio laikas yra pigus, o programuotojų laikas kainuoja brangiai, tad aš geriau rinkčiausi lėtesnę šablonų sistemą (na, ne tris kart lėtesnę, bet tarkim iki 50% lėtesnę) jei su ja man būtų žymiai lengviau programuoti. Šablonų kodas vis tiek neužima labai daug laiko, tad geriausiu atveju bus sutaupoma keletas dešimčių tūkstantųjų sekundės kiekvienai užklausai. Sakoma, kad lašas po lašo ir akmenį pratašo, o centą pridėjus prie cento susidaro milijonai, bet abejoju ar šie palyginimai čia tinka. Na, jei svetainė gauna po 10 užklausų per sekundę, gal tada ir bus pastebėtas šioks toks skirtumas kokį šablonų variklį naudosime, bet kiek yra svetainių, kur užklausos ateina po 10 per sekundę? Juk tai beveik milijonas užklausų per dieną (heh, aš esu laimingas kai gaunu kokį tūkstantį ;)

Tad manau, jog šablonų „benchmarkinimas“ yra per daug sureikšminamas. IMHO aišku ;)

PHP šablonai: kodėl ne HTML?

Pasiskaičius apie lietuviškus (ir ne tik) PHP šablonus pasidarė man
labai keista ir įdomu kodėl visuose php šablonuose naudojamos kelių
stilių žymos (t.y ir <tplbilekas> HTML
stiliaus ir {foo.bar} stiliaus)

Kažkaip nesugebu šito pateisint niekaip. Juk gi su tais
{} tik problemos su JavaScriptais ir panašiai
(pamenat, pukomuko ten changeloge vargai aprašyti? :)
Be to su HTML stiliaus žymomis tai jei nesuveikia šablonas dėl kažkokių
priežasčių, tai nelenda šiūkšlės į ekraną, nes naršyklės ignoruoja
nežinomas HTML žymes.

Be to turint gražų HTML netgi nebereikia šablonų variklio –
galima XSL pritaikyt su visais XSLT navarotais ir jaučiu dar greičiau
būtų (nors aišku nežinau — XML parsinimas tai ne šiaip sau greitas ir
lengvas dalykas atminties požiūriu)

Aišku turbūt man tokios mintys kyla, nes esu per daug pripratęs prie
Perlinio HTML::Template

Įvadas į Perl: antroji dalis: kintamųjų sritys, ciklai ir sąlygos

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
(bloką sudaro 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
switch/case (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

perskaityt.

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 sąkinius (ir dar apie tuos kurie čia nepaminėti)
galima rasti perlsyn

dokumentacijoje.

Dainų šventė

Kaip jau turbūt pastebėjot, paskutiniu metu čia ne dažnai atnaujinu
svetainę. Priežastis paprasta – dainų šventė. Dirbu gi kompanijoj,
kuri yra organizatorius, tad šią savaitę tikrai pakanka darbo ;)