![]() ![]() |
ARCHIV |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() |
|
Twigil | Význam |
---|---|
. | přístup k datům objektu, veřejná data |
! | přístup k datům objektu, soukromá data |
? | pro data známé v době kompilace; například $?LINE místo starého __LINE__ |
* | například $*IN, $*OUT, $*ENV, $*PID, $*ARGV |
^ | proměnná jako poziční parametr, používá se i například jako $^a, $^b, $^c atd. (řazené lexikograficky) místo starých $a a $b |
: | pojmenovaný parametr |
< | $<zachyceni> zachytávání zapamatovaných hodnot u regulárních výrazů; využijeme v příštím dílu |
= | POD proměnná |
~ | subjazyky (například $~MAIN, $~Q, $~P5Regex) |
Podívejme se, jakými způsoby lze deklarovat proměnné.
Deklarátor | Význam |
---|---|
my | lexikálně vymezené proměnné |
state | lexikálně vymezené perzistentní proměnné |
our | balíkové proměnné |
has | atributy objektů |
anon | anonymní jména |
augment | přidává definice (například regulární výraz do gramatiky, uvidíme v příštím dílu) |
supersede | mění existující definice |
Končí local, ale lze používat temp.
U často používaných konstrukcí mohou být vynechávány kulaté závorky. Cykly a podmínky tak lze psát v tomto stylu (dříve to bylo možné pouze v postfixovém zápisu).
if 5 < 10 {
say "OK";
}
Podobně je to s definicí pole. Operátor čárka se zde již chová jinak (v Perlu 5 by následující kód měl úplně jiný význam - toto lze uvést jako důkaz nekompatibility Perlu 6 s předchozími verzemi).
@pole = 1, 2, 3;
Pro vytváření pole řetězců nyní máme místo qw novou syntaxi.
@retezce = <a b c>
Nově lze snadno na pole konvertovat proměnnou s mezerami.
@retezce = <<a $prvky_oddelene_mezerou c>>
Exsituje také speciální operátor Q pro uvozování, který přijímá různé modifikátory.
Lze vytvořit pole s "nekonečně mnoha" prvky uvedením hvězdičky nebo Inf jako horní meze. Následující kód bude fungovat.
my @pole = 0 .. Inf;
say @pole[10000];
Obsah pole se vyhodnocuje líně. Dokud ho nepotřebujeme, nebude se počítat. Příslušná část se vyhodnocuje, jakmile je to potřeba (čtení hodnoty).
S tím souvisí i zavedení konstrukce gather...take. Vytvoříme pole @nadruhou všech čtvercových čísel od 0 do nekonečna.
@nadruhou = gather for 0 .. Inf {
take $_ ** 2;
};
Celý proces se zde vyhodnocuje líně, což znamená, že příslušné hodnoty prvků pole @nadruhou budou dopočteny teprve až dojde k jejich přečtení. Díky tomu není plýtváno cennými jednotkami CPU, pokud výpočet nebude potřeba.
V Perlu 5 jsme se vůbec nemuseli starat o datové typy používaných proměnných. Pracovali jsme s různými druhy dat a Perl si je v tichosti sám podle nějakých pravidel konvertoval.
To v Perlu 6 zůstává, ale nově bude existovat i možnost explicitního uvedení datového typu programátorem při deklaraci proměnné.
#!/usr/bin/env perl
my Str $retezec1 = "1";
my Str $retezec2 = "cokoliv";
my Int $cislo = 1;
say $retezec1; #tiskne 1
say $retezec1 + $cislo; #tiskne 2 - také v pořádku, k vyhodnocení se použije konverze
# řetězce na číslo
say $retezec2 + $cislo; #tiskne 1 - také v pořádku, obsah $retezec2 byl vyhodnocen jako 0
$cislo = "cokoliv"; #chyba - nelze přiřadit řetězec do celočíselné proměnné
K dispozici máme následující datové typy.
Kód | Název |
---|---|
Any | cokoliv (dynamické chování jako v Perlu 5; takto se chovají proměnné bez deklarace) |
Int | celé číslo |
Str | řetězec |
Num | číslo |
Rat | racionální číslo (zlomek) |
Bool | true/false |
NejakaTrida | objekt daného typu |
Výraz lze testovat na datový typ pomocí v Perlu 6 oblíbeného operátoru "odpovídat si", který se zapisuje ~~. Například výraz 1 ~~ Int je pravdivý.
Lze definovat vlastní datové typy. Například datový typ pro sudá čísla bychom definovali takto.
subset Even of Int where { $_ % 2 == 0 }
Pro pohled do nitra datové struktury jsme se naučili používat modul Data::Dumper. Nyní ale pro základní orientaci postačí následující.
my $a = [(1, 2), (3, 4), [5, 6]];
say $a.perl; # vytiskne řetězec [(1, 2), (3, 4), [5, 6]]
V Perlu 5 máme funkci scalar, která vynutí skalární kontext. V Perlu 6 lze již vynutit libovolný kontext. Následující tabulka uvádí, jak vynutit jednotlivé (již specializovanější než jen prázdný, skalární a pole) datové typy.
Syntaxe | Význam |
---|---|
~něco | řetězec |
?něco | boolean |
+něco | číslo bez znaménka |
-něco | číslo se znaménkem |
$(něco) | skalár |
@(něco) | pole |
@@(něco) | řez polem (narozdíl od kontextu pole řezy vzájemně neinteragují) |
%(něco) | hash |
Díky této změně budeme moci zjednodušit spoustu zápisů. Jak bychom například v Perlu 6 zjistili neprázdnost pole?
Podprogram s názvem MAIN si automaticky vezme parametry z příkazového řádku. Ukažme si, jak to lze použít.
sub MAIN ($arg1, $arg2) {
say "Parametry: $arg1 $arg2";
}
A teď se podívejme, jak bude program reagovat na volání.
$ perl6 main.pl 1 2
Parametry: 1 2
$
Co když uvedeme jiný počet parametrů? Pak se automaticky zavolá podprogram USAGE, který implicitně vytiskne následující zprávu.
$ perl6 main.pl 1 2 3 4 5
Usage:
add.pl arg1 arg2
$
Pokud místo klíčového slova sub uvedeme multi, lze vytvořit různé MAIN pro různé prototypy. Také lze zadávat parametry --arg1 --arg2.
V hlavičce podprogramů je třeba v Perlu 6 pojmenovat parametry, protože již nebudeme používat proměnnou @_. Podprogramy tak budou vypadat následovně.
sub nadruhou($cislo){
return $cislo ** 2;
}
I zde je možné explicitně uvést datový typ.
sub nadruhou(Rat $cislo){
return $cislo ** 2;
}
Důležité však je, že tyto parametry budou pouze pro čtení a při pokusu o změnu jejich hodnoty bude vyvolána výjimka. Toto chování lze změnit atributem is rw.
Existují tři módy předávání parametrů:
Parametry mohou být povinné i nepovinné. Standardně jsou povinné a pro změnu chování je třeba uvést za pojmenovaný parametr znak ! a za poziční znak ?. Srkající parametry jsou vždy nepovinné.
Podívejme se na příklad, který ukazuje chování dvou různých volání.
sub funkce($pozicni, :$pojmenovany, *@srkajici){
...
}
funkce(1, 2, 3); # $pozicni=1, $pojmenovany=2, @srkajici=(3)
funkce(:pozicni<1>, :pojmenovany<2>, 3); # $pozicni=1, $pojmenovany=2, @srkajici=undef
Pomocí následujícího kódu lze vytvářet něco jako speciální datový typ pro konečné množství hodnot.
enum Rok (2011 2012 2013);
Hodnotu pak reprezentujeme jako Rok::2011.
for a while cyklus můžeme psát v nové syntaxi. V jedné iteraci můžeme ze seznamu převzít i více než jeden prvek.
for @seznam -> $i, $j {
say "Máme prvky $i, $j.";
}
Céčkovský for cyklus je nyní přejmenován na loop. Cyklus loop {} se dá také použít jako nekonečná smyčka.
Koncept handlerů z Perlu 5 samozřejmě funguje dále. Perl 6 ale nabídne několik zajímavých usnadnění. Podívejme se, jak budeme moci otevřít soubor a číst z něj.
my $fh = open "nejaky_soubor";
print $fh.get; # tiskne řádek
print $fh.getc; # tiskne znak
$fh.close
Jak vytvoříme nový soubor (analogie unixového touch)?
open("novy_soubor", :w).close
A co zápis?
open "nejaky_soubor", :w;
$fh.say("toto zapíšeme do souboru");
$fh.print("toto taky");
Za zmínku stojí též funkce slurp s názvem souboru jako parametrem, která vrátí obsah souboru.
Změnilo se také testování souborů. Nyní budeme testovat pomocí nového operátoru ~~ pro "odpovídání si", se kterým můžeme porovnávat skoro všechno se vším. Ještě se s ním setkáme později. Například existenci souboru ověříme následovně.
if ("jmeno_souboru".IO ~~ :e){
say "existuje";
}
V Perlu 5 vznikaly objekty pomocí funkce bless. To je možné stále, ale existuje nově také paralelní model, který je inspirován i již existujícím Moose.
Okamžitě viditelnou je změna operátoru šipky na tečku při přístupu k metodám a atributům.
Takto bychom mohli začít psát třídu pro manipulaci s komplexními čísly. Musíme deklarovat atributy pro reálnou a imaginární část pomocí deklarátoru has. Atributy se označují uvedením tečky hned po sigil znaku.
class KomplexniCislo is rw {
has $.re;
has $.im;
}
Takto potom vytvoříme číslo 1 + 2i.
my $komplex = KomplexniCislo.new(re => 1, im => 2);
Dále s ním samozřejmě můžeme manipulovat.
$komplex.re = 3;
$komplex.im = 4;
say "Nová hodnota: ", $komplex.re, " + ", $komplex.im, "i"
Nové OOP bude podporovat role, které budou fungovat podobně jako v Moose. Role jsme již probrali dříve a proto zde jen uveďme, jak se budou v Perlu 6 používat.
class Organizmus {...}
class Clovek is Organizmus {...}
role Vareni {...}
class Kuchar is Clovek does Vareni {...}
Nyní bychom mohli tuto roli přiřadit konkrétnímu objektu.
my $clovek = new Clovek;
$clovek does Vareni;
Přípojky jsou hodnoty, které se mohou vyskytovat ve více stavech. Jde o velmi zajímavou myšlenku, která se poprvé v Perlu objevila jako modul Quantum::Superpositions.
Zadefinujme proměnnou, která se bude vyskytovat v 5 stavech. Nejprve se podívejme na přípojku typu "any", která reprezentuje některou z hodnot.
my $mnozina1 = 0 | 1 | 2 | 3 | 6;
Nyní krátce zkoumejme vlastnosti této proměnné. Můžeme zkusit testovat, jaké číslo tato proměnná reprezentuje. Následující test dopadne úspěšně.
if 2 == $mnozina1 {
say "2 je OK";
}
Zajímavé je, že úspěšně dopadne i následující test. U tohoto typu přípojky je totiž pro rovnítko lepší intepretací operace "být prvkem množiny".
if 2 == $mnozina1 == 3 {
say "4 je OK";
}
Vybereme-li číslo mimo množinu, test neuspěje.
if 5 == $mnozina1 {
say "5 je OK";
}
Leckoho napadne, jak se chová $mnozina1 při běžných aritmetických operacích.
say $mnozina1 * 2;
Asi ale nikoho nepřekvapí, že výsledným výrazem je další přípojka, protože je to jediný konzistentní způsob. Výraz se tedy vyhodnotí na any(0, 2, 4, 6, 12).
Ještě existuje druhý typ přípojky a to typ "all". Ta vyjadřuje všechny hodnoty.
my $mnozina2 = 1 & 2 & 5;
Rozdíl si můžeme ukázat například při porovnávání. Když porovnáváme dvě "any" přípojky mezi sebou, výraz je pravdivý, pokud existuje v první přípojce prvek, který je obsažen i ve druhé. Porovnáváme-li "all" přípojky, musí mít pro pravdivou hodnotu všechny stavy identické.
Při porovnávání "any" a "all" přípojky musí existovat každý stav "all" přípojky i v "any" přípojce. Následující výraz je potom nepravdivý.
$mnozina1 == $mnozina2
Dodejme, že nezávisí na pořadí prvků v přípojkách.
Měli bychom připomenou i to, že bitové operátory (jako které by přípojky identifikoval Perl 5) mají nyní novou syntaxi. Více v dokumentaci.
Poznamenejme, že s přípojkami souvisí ještě to, že výraz obsahující all(@pole) se může začít samovolně zpracovávat ve více vláknech. Uvedení all se totiž chápe tak, že nezáleží na pořadí, ve kterém se budou výrazy zpracovávat.
Využití může vypadat i takto.
if $p ~~ all(@regularni_vyrazy) {...}
Na okraj zmiňme také makra. V Rakudo Perlu zatím nejsou implementované, ale v budoucnu bude fungovat kód následujícího typu.
macro hello($what) {
q:code { say "Hello { {{{$what}}} }" };
}
Nejsou žádné diskuzní příspěvky u dané položky. Příspívat do diskuze mohou pouze registrovaní uživatelé. |
28.11.2018 23:56 /František Kučera
Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz
22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera
Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák
LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera
Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz
20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera
Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera
Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
31.7.2023 14:13 /
Linda Graham
iPhone Services
30.11.2022 9:32 /
Kyle McDermott
Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš
Re: zavináč
2.12.2018 23:56 /
František Kučera
Sraz
5.10.2018 17:12 /
Jakub Kuljovsky
Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?