Odkaz (reference) Skalární proměnná, která obsahuje adresu jiné proměnné Adresa je místo v paměti počítače, kam se ukládají data. Odkaz je skalární proměnná, i když odkazuje na pole nebo hash. Použití vícerozměrná pole anonymní proměnné (beze jména) složité datové struktury
Vytvoření odkazu Pomocí zpětného lomítka před jménem proměnné: my ($a,$b,$c) = (1,11,111); # odkazy lze ukládat do polí: = (\$a,\$b,\$c); # nebo i \($a,$b,$c) $c 111 $cislo_ref adresa my $c = 111; my $cislo_ref = \$c; print $$cislo_ref; # tzv. dereference
Vytvoření odkazu na pole a hash Stejně - pomocí zpětného lomítka před jménem: = (1,2,3,4,5); my $pole_ref = my %slovnik = (jablko =>"apple", broskev =>"peach"); my $slovnik_ref = \%slovnik; HASH(0x80640a4) ARRAY(0x8063ff0) SCALAR(0x80809f0) Jediné rozumné použití – porovnání, zda dva odkazy ukazují na stejné místo v paměti pomocí ==. Odkazy jsou obyčejné proměnné, lze je tedy i vytisknout. print "$slovnik_ref $pole_ref $cislo_ref\n";
Vnořená pole = (10,20,30,40); = = (100,200,300,[1,2,[10,20,30,40],3,4],400); #anonymně za chvíli
Anonymní odkazy Místo = (1,2,3,4,5); my $pole_ref = můžeme rovnou napsat: my $pole_ref = [1,2,3,4,5]; teď neexistuje, ale odkaz na něj ano. Podobně místo my %slovnik = (jablko =>"apple", broskev =>"peach"); my $slovnik_ref = \%slovnik; můžeme rovnou napsat: my $slovnik_ref ={jablko =>"apple", broskev =>"peach"};
Dereference Hodnotu uloženou na adrese, na niž ukazuje nějaký odkaz, získáme pomocí složených závorek {} (nepovinné, ale jinak nepřehledné): = (1,2,3,4,5); my $pole_ref = print foreach {print "Prvek: $_\n";} $pocet = $#{$pole_ref} + 1; print "Počet prvků pole je $pocet.\n"; print "3. prvek pole pole je $pole[2]\n"; print "To samé pomocí odkazu: ${$pole_ref}[2]\n";
Data a odkazy na ně Cokoli se provádí s odkazy na data, provádí se s daty samotnými. 2 různé přístupy k témuž. Víc odkazů na stejná data, všechny je ovlivňují stejně. # Vymazání prvku pole = (1,2,3,4,5); my $pole_ref = my $ref2 = $pole_ref; # totéž jako nebo Totéž platí i pro anonymní odkazy my $ref = [1,2,3,4,5];
Pár příkladů Co Pavel Monika)]} Co udělá tento prográmek? my %pady = (1=>"nominativ",2=>"genitiv",3=>"dativ"); my $ref = \%pady; foreach(keys %{$ref}) { print "Key: $_ $pady{$_} ${$ref}{$_}\n";}
Šikovná zkratka my $ref = [1,2,[10,20,30]]; print "${$ref}[2]","\n"; print ${${$ref}[2]}[1],"\n"; ${$odkaz} $odkaz-> print "$ref->[2]","\n"; print ${$ref->[2]}->[1],"\n"; print $ref->[2]->[1],"\n"; my $pady_r = {1=>"nominativ", 2=>"genitiv", 3=>"dativ")}; foreach(keys %{$pady_r}) { print "$_ ${$pady_r}{$_}\n";} print "$_ $pady_r->{$_}\n";
Odkazy jako parametry podprogramu Parametry podprogramu se ukládají do 2 parametry typu pole se "zploští" do jednoho pole Podprogramu se nepředají hodnoty polí, ale odkazy na pole, tedy skalární hodnoty. Podprogram si hodnoty přečte z adres, které dostal jako parametry Podobně lze předávat odkazy na hashe Odkazy mohou tvořit i výstupní hodnoty podprogramů.
#!/usr/bin/perl = (1,2,3); = (10,20,30); print sub secti { for(my $i=0; $i<=$#c1; $i++) { $v[$i] = $c1[$i] + $c2[$i]; }
#!/usr/bin/perl = (1,2,3); = (10,20,30); my $r_v; $r_v = print sub secti { my ($r1,$r2) for(my $i=0; $i<=$#{$r1}; $i++) { $v[$i] = $r1->[$i] + $r2->[$i]; } return }
#!/usr/bin/perl = (1,2,3); = (10,20,30); print sub secti { for(my $i=0; $i<=$#c1; $i++) { $v[$i] = $c1[$i] + $c2[$i]; } #!/usr/bin/perl = (1,2,3); = (10,20,30); my $r_v; $r_v = print sub secti { my ($r1,$r2) for(my $i=0; $i<=$#{$r1}; $i++) { $v[$i] = $r1->[$i] + $r2->[$i]; } return }