"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";"> "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";">

Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

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á,

Podobné prezentace


Prezentace na téma: "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á,"— Transkript prezentace:

1 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

2 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í: my @odkazy = (\$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

3 Vytvoření odkazu na pole a hash Stejně - pomocí zpětného lomítka před jménem: my @pole = (1,2,3,4,5); my $pole_ref = \@pole; 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";

4 Vnořená pole my @pole1 = (10,20,30,40); my @pole2 = (1,2,\@pole1,3,4); my @pole3 = (100,200,300,\@pole2,400); @pole1 10 20 30 40 @pole3 100 200 300 @pole2 400 @pole2 1 2 @pole1 3 4 my @pole3 = (100,200,300,[1,2,[10,20,30,40],3,4],400); #anonymně za chvíli

5 Anonymní odkazy Místo my @pole = (1,2,3,4,5); my $pole_ref = \@pole; můžeme rovnou napsat: my $pole_ref = [1,2,3,4,5]; Pole @pole 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"};

6 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é): my @pole = (1,2,3,4,5); my $pole_ref = \@pole; print "@{$pole_ref}"; foreach (@{$pole_ref}) {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";

7 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 my @pole = (1,2,3,4,5); my $pole_ref = \@pole; my $ref2 = $pole_ref; pop @{$ref2}; # totéž jako pop @{$pole_ref} nebo pop @pole Totéž platí i pro anonymní odkazy my $ref = [1,2,3,4,5]; pop @{$ref};

8 Pár příkladů Co je toto? @{[1,2,3,4,5]} \@{[1,2,3,4,5]} @{[qw(Petr 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";}

9 Š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";

10 Odkazy jako parametry podprogramu Parametry podprogramu se ukládají do pole @_ 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ů.

11 #!/usr/bin/perl my @v1 = (1,2,3); my @v2 = (10,20,30); my @v; secti(\@v1,\@v2); print "@v\n"; sub secti { my @c1 = @{$_[0]}; my @c2 = @{$_[1]}; for(my $i=0; $i<=$#c1; $i++) { $v[$i] = $c1[$i] + $c2[$i]; }

12 #!/usr/bin/perl my @v1 = (1,2,3); my @v2 = (10,20,30); my $r_v; $r_v = secti(\@v1,\@v2); print "@{$r_v}\n"; sub secti { my @v; my ($r1,$r2) = @_; for(my $i=0; $i<=$#{$r1}; $i++)‏ { $v[$i] = $r1->[$i] + $r2->[$i]; } return \@v; }

13 #!/usr/bin/perl my @v1 = (1,2,3); my @v2 = (10,20,30); my @v; secti(\@v1,\@v2); print "@v\n"; sub secti { my @c1 = @{$_[0]}; my @c2 = @{$_[1]}; for(my $i=0; $i<=$#c1; $i++) { $v[$i] = $c1[$i] + $c2[$i]; } #!/usr/bin/perl my @v1 = (1,2,3); my @v2 = (10,20,30); my $r_v; $r_v = secti(\@v1,\@v2); print "@{$r_v}\n"; sub secti { my @v; my ($r1,$r2) = @_; for(my $i=0; $i<=$#{$r1}; $i++) { $v[$i] = $r1->[$i] + $r2->[$i]; } return \@v; }


Stáhnout ppt "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á,"

Podobné prezentace


Reklamy Google