Nuorodos

Sukūrimas Naudojimas Komentarai ir pastabos
Naudojant simbolį \ prieš kintamąjį, į kurį reikia nuorodos
$scalarref = \$foo; $bar = $$scalarref; Kintamojo $foo reikšmė priskiriama kintamąjam $bar
$arrayref = \@ARGV; push(@$arrayref, $filename); Prie masyvo @ARGV prijungiama reikšmė iš kintamojo $filename
$$arrayref[0] = "January"; Masyvo @ARGV pirmajam elementui priskiriama reikšmė January
$hashref = \%ENV; $$hashref{"KEY"} = "VALUE"; Asociatyviojo masyvo %ENV elementui su raktu KEY priskiriama reikšmė VALUE
$coderef = \&handler; &$coderef(1,2,3); Iškviečiama funkcija $handler su parametrais 1,2,3
$globref = \*foo; print $globref "output\n"; Išveda žodį output su eilutės perkėlimu į failo deskriptorių foo
Naudojant [] skliaustus nuorodai į anoniminį masyvą sukurti
$arrayref = [1, 2, ['a', 'b', 'c']]; $x=$arrayref->[2][1]; Kintamasis $arrayref turės nuorodą į masyvą iš 3 elementų, kurių paskutinis savo ruožtu yra masyvas iš 3 elementų; kintamajam $x bus priskirta reikšmė b
Naudojant {} skliaustus nuorodai į anoniminį asociatyvųjį masyvą sukurti
$hashref = {"Jonas" => "Stasė", "Petras" => "Pranė"}; $x=$hashref->{"Jonas"}; Kintamasis $hashref turės nuorodą į asociatyvųjį masyvą su 2 raktais; kintamajam $x bus priskirta reikšmė Stasė
sub x{ +{@_} }
sub y{ return{@_}}
Kai galimas keleriopas interpretavimas prieš {} gali tekti pridėti + ženklą arba return operatorių, kurie pasakytų, jog šiuos {} reikia interpretuoti kaip nuorodą.
Nurodant * prieš vardą
$ref = *lialia; $lialia="tralia";
@lialia=(1,2,3);
print $$ref,$$ref[1],@$ref;
Kintamajam $ref priskiriama nuoroda į VISŲ tipų kintamuosius su tokiu vardu. Sakinys spausdins tralia2123.
Nurodant * prieš vardą ir pateikiant tipą tarp {}'ių
$scalarref=*lialia{SCALAR};
$arrayref=*lialia{ARRAY};
$hashref=*lialia{HASH};
$coderef=*lialia{CODE};
$ioref=*lialia{IO};
$globref=*lialia{GLOB};
Analogiškai aukščiau esančiam pavydžiui, tik nuoroda gaunama tik į to tipo kintamąjį su duotu vardu. Bandymas "eiti pagal" (dereference, angl.) kito tipo nuorodą yra klaida!
Priskiriant kintamajam reikalingo kintamojo/ funkcijos vardą
$lialia = 5; $lia = 2;
$ref="lia"; print $$ref; #spausdins 2 - kintamojo $lia reikšmę
print ${$ref x 2}; # spausdins 5 - kintamojo $lialia reikšmę

Funkcijos

Sintaksė
sub vardas; - išankstinis apibrėžimas;
sub vardas(prototipas); - išankstinis apibrėžimas su parametrais;
sub vardas blokas - funkcijos paskelbimas
sub vardas(prototipas)blokas - funkcijos paskelbimas nurodant parametrų tipus;
Pavyzdys:
sub D{ b*b-4*a*c;}
Gražinama reikšmė
Paskutinio funkcijoje vykdyto sakionio reikšmė
išraiškos, pateiktos operatoriui return reikšmė
funkcijos gali būti rekursyvios

Funkcijos iškvietimas ir parametrų perdavimas

  • Funkcijos iškviečiamos:
    vardas(parametrai) - & nėra reikalingas, kai naudojami skliaustai;
    vardas parametrai; - skliaustai nėra reikalingi, jei funkcija yra prieš tai aprašyta;
    &vardas; - jei parametrų nereikia perduoti - jie gali būti nenurodomi (šiuo atveju tuo metu buvusi spec. kintamojo @_ reikšmė nebus pakeista įeinant į funkcijos kodą.
  • Funkcijos neturi formaliai aprašytų parametrų su vardais
  • Argumentai funkcijoms perduodami per specialųjį kintamąji @_
  • Pavyzdys
    	fun(1, "abc", 4);
    	sub fun{
    	  print $_[1]; # spausdins abc
    	}
  • Tiesiogimis priskyrimas kintamajam @_ arba operatoriaus/ funkcijos, priskiriančios jam panaudojimas padaro priėjimą prie funkcijos parametrų nebeįmanomu (jei jie nebuvo prieš tai išsaugoti kituose kintamuosiuose/ nuorodose).
  • Kaip parametrai perduodami masyvai ir asociatyvieji masyvia yra "ištiesinami". Pavydzys:
    	@a = (1, 2); @b = (3, 4);
    	fun(@a, @b);
    	sub fun{
    	  print $_[1]; # spausdins 2, o ne 34, kaip būtų galima tikėtis
    	}
    	
  • Norint perduoti masyvus, reikia juos perduoti per nuorodas. Pavyzdys:
    	@a = (1, 2); @b = (3, 4);
    	fun(\@a, \@b);
    	sub fun{
    	  print @{$_[1]}; # spausdins 34, kaip ir norėta
    	}
    	
  • Parametrai į funkcijas perduodami kaip kintamieji. Keičiant specialųjį kintamąjį @_ galima keisti argumentų reikšmes. Jei į funkciją yra perduodama kaip argumentas konstanta, to parametro keisti negalima. Pavyzdys:
    	sub fun{
    	  @_[0] *= 2;
    	}
    	$x = 1; 
    	fun($x);
    	print $x; # spausdins 2
    	fun(5); # klaida vykdant šia funkciją, nes konstantos keisti negalima
    	

    Kintamųjų akiratis

  • kintamieji, jei nenurodyta kitaip, yra globalūs (vieną kartą panaudotas jis tampa prieinamas visoje programoje)
  • kintamąjį galima lokalizuoti naudojant 2 konstrukcijas: local ir my

    local lokalizavimo būdas

  • local įterpia į perl'o interpretatoriaus žinomų vardų sąrašą naujus kintamuosius. Šie vardai galioja tol, kol paliekamas blokas, kuriame buvo naudojama konstrukcija local. Taigi, žemiau pateikta programa spausdins 321.
    
    	$x = 1;
    
    	sub f{$x=2;} 
    	sub g{
    		local $x;		
    		print $x;	# Nieko neatspausdinama, nes naujam $x nebuvo priskirta
    		$x = 3; print $x;
    		f;  print $x;	# Funkcija f() pakeičia šioje funkcijoje pasklebto $x reikšmę
    	}
    
    	g; 
    	print $x; 		# funkcijoje g() paskelbtas $x nebegalioja - spausdinamas 1
  • Sintaksės variantai
    local $kintamasis - nuo šiol bus naudojamas naujas $kintamasis
    local ($a, $b) - galima lokalizuoti keletą kintamųjų iš karto
    local (%c, @d) - galima lokalizuoti visų tipų kintamuosius
    local (%c, @d)=masyvas_arba_sąrašas - lokalizavimas su priskyrimu;
    local *x - lokalizuojami $x, @x, %x ir t.t.
    local *tra = *lia - lokalizuotas $tra atitinka $lia, localizuotas @tra atitinka @lia ir t.t.
    local *tra = \$lia - lokalizuotas $tra atitinka $lia

    my lokalizavimo būdas

  • my yra panašus į konstrukcijas, aprašančias automatinius kintamuosius imperatyvinėse programavimo kalbose. Jis aprašo kintamąjį, kuris yra žinomas tik tame bloke, kuriame aprašytas. Taigi, žemiau pateikta programa spausdins 332.
    
    	$x = 1;
    
    	sub f{$x=2;} 
    	sub g{
    		my $x;
    		print $x;	# Nieko neatspausdinama, nes naujam $x nebuvo priskirta
    		$x = 3; print $x;
    		f;  		# Funkcija f pakeičia globalaus kintamojo $x reikšmę, nes 
    				# joje gunkcijos g() kintamasis $x nėra žinomas
    		print $x; 	# spausdinamas 3 nes f() kintamojo nepakeitė
    	}
    
    	g; print $x; 		# spausdinama 2, nes f() priskyrė tokią reikšmę
  • Sintaksės variantai
    my $kintamasis - nuo šiol bus naudojamas naujas $kintamasis
    my ($a, $b) - galima lokalizuoti keletą kintamųjų iš karto
    my (%c, @d) - galima lokalizuoti visų tipų kintamuosius
    my (%c, @d)=masyvas_arba_sąrašas - lokalizavimas su priskyrimu;

    Prototipai

  • Prototipai naudojami nusakyti, kokias reikšmes funkcija gaus. Jie keičia tik nauju būdu (nenaudojant &) kviečiamoms funkcijoms aprašyti
  • Prototipas susideda iš sekos spec. simbolių, pateikiamų tarp funkcijos aprašymo skliaustų (). Specialūs simboliai ir jų reikšmės:
    • $ - šioje vietoje turės būti skaliarinis kintamasis; perveda kontekstą kvietimo vietoje į skaliarinį
    • @ - šioje vietoje bus masyvas; "suvalgo" visus toliau esančius parametrus
    • % - šioje vietoje bus asociatyvusis masyvas; "suvalgo" visus toliau esančius parametrus
    • ; - skiria būtinus parametrus nuo nebūtinų
    • \ - parodo, kad toje vietoje esančio parametro argumentas turi būti kintamasis, prasidedantis toliau sekančia simboliu (t.y. būtent masyvas, būtent funkcija ir t.t.). Parametras bus paimtas kaip nuoroda!
    • & - parodo, kad šioje vietoje turi būti funkcija/ vykdomas blokas. aprašant kodą kvietimo vietoje nereikalaujama naudoti raktinį žodį sub, o po pačio kodo galima nedėti kablelio
    • * - nurodo, kad šioje vietoje bus nuoroda į simbolių lentelės įrašą
    • tušti skliaustai - parodo, kad funcija neturi argumentų. Naudotina konstantom apibrėžti.
  • Pavyzdžiai
    KodasRezultatas
    sub mygrep (&@) {
      my $code = shift;
      my @result;
      foreach $_ (@_) {
        push(@result, $_) if &$code;
      }
      @result;
    }
    mygrep { /foo/ } $a,$b,$c
    @a = (1, 2); @b = (3, 4);
    sub fun(@@){
    	print $_[1];
    }
    fun(@a, @b);
    2
    @a = (1, 2); @b = (3, 4);
    sub fun(\@\@){
    	print @{$_[1]};
    }
    fun(@a, @b);
    34
    @a = (1, 2); @b = (3, 4);
    sub fun(\@\@){
             print @{$_[1]}; 
    }
    fun(@{[5,6]},@b);
    34
    @a = (1, 2); @b = (3, 4);
    sub fun(\@\@){
    	print @{$_[1]};
    }
    &fun(@a, @b);
    NIEKO!