Perl samozrejme vnorene seznamy umi a to uzitim specialnich zavorek [ ], jejichz hodnotou je odkaz na pole. Tedy:
@a = ( [ 'a', 'b' ], 'c') je pole o dvou prvcich, kdy prvni je odkaz na pole o dvou prvcich. Pristupuje se k tomu zcela transparentne. A kdyz se chce vytvorit vnorene pole z existujiho pole, tak se uzije @b = ( \@a, 'd').
Moje rec. Python je opravdu jeden z nejsilnejsich<a nejkrasnejsich jazyku, ktere jsem kdy potkal. Je strasne snadny k pochopeni, zadny zavorkovy peklo, proste vim, ze [] je list, () je tuple a {} asociativni pole. A z toho vseho se nechaji poskladat krasne veci. Ke vsemu vse je objektove (od verze 2.2 se necha dedit i od vestavenych typu), slice konstrukce, __doc__ stringy, moznost emulovat ruzne atributy objekt pomoci __getattr__ a __setattr__, vyznaceni jednotlivych bloku jen na zaklade odsazeni, "> a nejkrasnejsich jazyku, ktere jsem kdy potkal. Je strasne snadny k pochopeni, zadny zavorkovy peklo, proste vim, ze [] je list, () je tuple a {} asociativni pole. A z toho vseho se nechaji poskladat krasne veci. Ke vsemu vse je objektove (od verze 2.2 se necha dedit i od vestavenych typu), slice konstrukce, __doc__ stringy, moznost emulovat ruzne atributy objekt pomoci __getattr__ a __setattr__, vyznaceni jednotlivych bloku jen na zaklade odsazeni, "multiplatformita", debuger a profiler napsany v pythonu, regulerni vyrazy, unicode... to vse me presvedcilo, ze tenhle jazyk je pro me tim pravym nabozenstvim.
Python ma kompilaci snad odjakziva. S cim trochu zaostava, to je optimalizace. Pokud si o ni clovek rekne volbou -o na prikazovym radku, python (2.0) pouze vynecha nastavovani nekterych debugovacich informaci. Verim, ze v novejsich verzich tomu ale bude jinak.
Dekuji, Honza
Pekny clanek, pokud clovek chce opacko perlu 5. Ale mozna by stalo za to, kdyz uz se opakuje perl 5, rict, co vsechno se (prevdepodobne) v perlu 6 zmeni:
=> nebude nadale jina forma carky
kontextu bude mnohem vic
nebudou existovat typegloby - proc se tedy tady opakuji ?
etc.
Ja nerikam, ze je spatne se rozepsat o perlu 5, ja si jen myslim, ze pro pochopeni perlu 6 neni treba vedet vsechny veci, ktere tam *nebudou*.
perl 6 bude mit neco jako bool, bude to prave jeden z novych kontextu.
jina vec jsou properties, ty umoznuji prilepit dalsi (pojmenovanou) hodnotu k objektu, cili:
return 0 is true;
se v numerickem kontextu vyhodnoti jako normalni nula, je-li vsak pouzita v podmince a tim v bool-kontextu, tak jako true. :)
1) "speciální znak "=>" je pouze náhražkou za čárku, kterou si tam Perl potom stejně dá."
Ovsem jisty maly ale podstatny rozdil mezi => a carkou tu prece jen je. Zkuste tohle :
%OK = (time => '15:30');
%BAD = (time, '15:30');
foreach (keys %OK) {print "OK: $_ => $OK{$_}\n"}
foreach (keys %BAD) {print "BAD: $_ => $BAD{$_}\n"}
=> totiz na rozdil od carky zaridi to, ze pokud ta vec pred nim vypada jako slovo tak se bude brat jako retezec a ne jako volani funkce.
2) "otázkou zůstává, co bude interpret říkat na to, když se pokusíme hash inicializovat lichým počtem prvků. ... nebude z toho moc nadšen, něco zabrumlá, ale program fungovat bude."
Tohle zavisi na tom jestli mate zapnute warningy. Coz byste samozrejme meli ;-)
3) "V Perlu rozeznáváme dva kontexty: skalární a seznamový. "
A pak jeste prazdny, ciselny a logicky. I kdyz ten ciselny a logicky wantarrayem nezjistite :
sub test {
print "wantaray=".wantarray()."\n";
print "wantarray ".(defined wantarray() ? "" : "not ")."defined\n";
};
print "LIST\n";
@a = test();
print "SCALAR\n";
$a = test;
print "VOID\n";
test();
Ciselny a logicky kontext zpusobuje urcite konverze.
4) Konstanty : "nejpřirozenější je vytvořit si funkci,
která prostě vrátí hodnotu"
sub PI { 3.1415 };
Lepsi je napsat to takhle :
sub PI () { 3.1415927}
ty kulate zavorky znamenaji, ze tato funkce nikdy nebere zadne parametry. A optimalizator zaridi, ze se ve skutecnosti zadna funkce volat nebude (jako inline funkce v C). A nehrozi vam potom, ze misto toho aby k PI nevo pricetl zavola funkci PI a da ji to cislo jako parametr.
Zkuste
print PI + 5;
postupne s obema definicema.
Z tohoto je jasne, ze
use constant PI => 3.1415927;
toho dela o malicko vic, nez ze nadefinuje funkci.
5) Typegloby
Podle me je lepsi existenci typeglobu zatajit. Prinejmensim zacatecnikum.
Pokud chcete predavat ovladace souboru nebo mit jistotu, ze vam ten vas ovladac nejaka jina funkce neprepise pak je spravny postup :
use FileHandle;
sub mySub {
...
my $FH;
open $FH, $filename or die "can't open: $!\n";
mySubSub(1,2,3,$FH);
close $FH;
}
Tohle je mnohem bezpecnejsi nez hrat si s typegloby.
6) "To není překlep, protože funkce return volaná bez parametrů implicitně vrací nepravdu. Mohli byste tedy napsat "return 0;" -- je to to samé v bledě modrém."
To tedy setsakra neni, jedine v logickem kontextu. Zkuste si vytisknout navratovou hodnotu te funkce ;-) Dokonce ani
return undef;
neni to same co
return;
Zkuste si :
sub Undef {return undef}
sub Nic {return}
@Undef = Undef;
@Nic = Nic;
print "Undef's true\n" if @Undef;
print "Nic's true\n" if @Nic;
7) in_gen_Ir: "return 0 is true;
se v numerickem kontextu vyhodnoti jako normalni nula, je-li vsak pouzita v podmince a tim v bool-kontextu, tak jako true"
Coz se v soucasnem Perlu obvykle pise
return "0 but true";
;-)
Hnidopich Jenda ;-)
P.S.: Jen pis dal Lukasi, nenech se otravit! Ja si nikdy nemuzu nechat ujit prilezitost se trosku vykecavat ;-)