Perl 5


Perl - Practical Extraction and Report Language

( pro ty kdo neumi englictin, volne prelozeno "Prakticky jazyk pro export a report" :)

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 :).

Promenne

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
 

Promenne

U funkci je zavedena nova fce. my promenna = hodnota. Je to obdoba local(..).

  sub ..{
  my $a = 3;
  ...
  }
 

Moduly

Pribyli dve fce. BEGIN a END, ktere slozi jako globalni konstrktor a destruktor.
 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

Reference

Reference se rozdeluji na hard a soft ( ty jsou castecne mozne i v Perlu 4 ).

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
  

Dereference

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 = 1
 
Tyto reference se daji vypnout pomoci switche use strict 'refs'; a zapnout no strict 'refs';

Objekty

Objekty jsou zcela novou vymozenosti perlu 5. Jsou zde implementovany zcela nejjednoduseji ( neni zavedena specialni deklarace ) je dosti mocny nastroj, ktery moznosti perlu jeste znasobuje. Objekty jsou v perlu 5 realizovany pomoci package-u ( vlastne obdoba modulu ).
 package Fero; # objekt Fero
 ...	 # fce & promenne
 package main; # hlavni objekt, ktery je implicitni
Konstruktor 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 :)