Perl je skriptovy jazyk pro praci se soubory a ruznymi datovymi formaty.
Je take velmi uzitecny na mnoho systemovych vecicek :) ( Kdo zna Satana
ten jiste vi o cem je rec :).
Zakladni popis a syntaxe je uvedena v dokumentu o Perlu 4 .
Zde uvedu pouze rozsireni Perlu 5 oproti Perlu 4 ( no a ono toho neni malo :).
Jedine rozsireni oproti perlu 4 jsou vicedimenzionalni pole a hasovaci tabulky mohou mit libovolne asociace.
$a[1][2] = 1; # dvourozmerne pole
%fero = ( 'ja' => 'ty', # to v perlu 4 neslo
'eva' => 'adam',
'red' => 0xff0000
); # definice hashe
U funkci je zavedena nova fce. my promenna = hodnota. Je to obdoba local(..).
sub ..{
my $a = 3;
...
}
BEGIN BLOK # na zacatku spusteni modulu se provede BLOK
END BLOK # po ukonceni modulu se spusti BLOK
# POZOR! BEGIN a END se provadeji globalne ->
# pri spusteni programu se provedou vsechny BEGINy a po ukonceni
# vsechny ENDy
Hard reference jsou velmi pribuzne ukazatelum v jynych jazycich. Nejsou to primo ukaztele do pameti, ale do tabulky ukazatelu na promenne. Takze, kdyz zmeni polohu promenne v pameti bude reference porad ukazovat spravne. Ziskat referenci na urcitou promennou lze ziskat pomoci operatoru '\' a specialnich konstrukci, ktere jsou specificke pro kazdou skupinu promennych.
$skalarref = \$skalar;
$poleref = \$a[1];
$hashref = \$a{'ja'};
vytvoreni anonymmniho pole:
$poleref = [1,2,['a','b]]; # anonymni dvourozmerne pole
print $poleref->[2][1]; # vytiskni prvek 2, 1 -> 'b'
vytvoreni anonymniho hashe:
$hashref = { 'Fero' => 'Jumbid' }; # anonymni hash
print $hashref->{'Fero'}; # vytiskne 'Jumbid'
vytvoreni anonymni subrutiny:
$coderef = sub { print"haf\n"; } # anonymni rutina
&$coderef; # vytiskne 'haf'
subrutina, ktera vraci referenci
sub vracimref {
...
return{ $a }; # vrati ref.
# POZOR !!!!!!!!!!! return $a vraci hodnotu $a
}
Pomoci anonymnich subrutin a navraceni referenci se muze vytvorit jednoduchy
template.
sub np {
my $x = shift; # naplni nasledujicim argumentem
return sub{ my $y= shift; print"$x $y\n"; }; # $x si zapamatuje
}
$h=np("Nazdar");
$g=np("Dekuji");
&$h("svete");
&$g("pekne");
Vytiskne :
Nazdar svete
Dekuji pekne
Kdyz uz mam referenci jak se dostat k hodnote promenne na kterou referuji ? Jak jednoduche staci dat pred referenci '$'.
$a = "nazdar"; $b = \$a; $c = $$b; print $c; # vytiskne 'nazdar'Nebo pomoci '->' :
$a = [1,[1]]; print $a -> [0][0];
Soft reference se realizuji nasledovne :
$name = "foo"; $$name = 1; # to same jako $foo = 1Tyto reference se daji vypnout pomoci switche use strict 'refs'; a zapnout no strict 'refs';
package Fero; # objekt Fero ... # fce & promenne package main; # hlavni objekt, ktery je implicitniKonstruktor muze mit libovolny nazev a muze delat cokoliv, ale ma jistou strukturu :
package Bar;
sub new
{
$type = shift; # jako prvni argument fci. je predavan nazev objektu
bless {},$type; # z asocijuje {} ( prazdny hash pomoci, ktereho se realizuji
# dynamicke objekty ) z objektem
}
Naopak destruktor ma pevny nazev a to DESTROY. Objekty v perlu se nemuseji
mazat, protoze pokud na nej neexistuje reference je automaticky smzan ( garbage collection ).
a ted maly prikladek:
package Bar; # defineuj novy objekt Bar
sub new # konstruktor
{
$type = shift;
bless {}, $type;
}
sub p # vytiskne prvni argument
{
print "$_[1]\n";
}
package main; # hlavni objekt do ktereho se predava rizeni pri spusteni
$a = Bar->new; # vytvor novy objekt
$a->p("nazdar");
Dedicnost a polymorfismus je realizovan pomoci pole @ISA, ve kterem jsou uvedeny
objekty v , kterych se ma hledat prislusna fce. nobo promenna , kdyz se nenajde
v aktualnim objektu.
package Bar;
sub new
{
my $type = shift;
my $left = {};
$self -> {'buz'} = 42;
bless $self,$type
}
package Foo;@ISA = qw( BAr ); # zobecnene zavorky
sub new
{
my $type = shift;
my $self = {};
$self->{'biz'} = 11;
bless $self,$type;
}
package main;
$a = Foo -> new;
print "buz=",$a->{'buz'},"\n";
print "biz=",$a->{'biz'},"\n";
Pretizeni operatoru se realizuje globalne pomoci hashe %OVERLOAD.
%OVERLOAD =
( '+' => \&myadd,
'-' => \mysub,
....
);
kde myadd a mysub jsou vlastni definovane fce.
Vse co zde bylo uvedeno je jen souhrn toho co se s perlem muze delat. Podrobnejsi informace se daji sehnat v manualovych strankach pro perl ( man perl ). Nebo na ruznych konferencich o perlu napr. comp.languages.perl. Tato stranka se jiste bude dale rozvijet a snad jednou bude v takovem stavu, ze se bude dat i porozumet :)