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ę |
fun(1, "abc", 4); sub fun{ print $_[1]; # spausdins abc }
@a = (1, 2); @b = (3, 4); fun(@a, @b); sub fun{ print $_[1]; # spausdins 2, o ne 34, kaip būtų galima tikėtis }
@a = (1, 2); @b = (3, 4); fun(\@a, \@b); sub fun{ print @{$_[1]}; # spausdins 34, kaip ir norėta }
sub fun{ @_[0] *= 2; } $x = 1; fun($x); print $x; # spausdins 2 fun(5); # klaida vykdant šia funkciją, nes konstantos keisti negalima
$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
$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ę
Kodas | Rezultatas |
---|---|
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! |