1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
|
.\" {PTM/WK/1999-10-10}
.rn '' }`
''' $RCSfile: perlref.1,v $$Revision: 1.7 $$Date: 2003/05/29 11:06:06 $
'''
''' $Log: perlref.1,v $
''' Revision 1.7 2003/05/29 11:06:06 robert
''' poprawki (gwnie warningi groffa)
'''
''' Revision 1.6 2002/05/21 09:29:19 robert
''' za wyjtkiem --> z wyjtkiem
''' i inne poprawki
'''
''' Revision 1.5 2001/06/14 08:43:14 wojtek2
''' s/,chyba, e/,chyba e/
''' plus troch literwek, formatowania etc.
'''
''' Revision 1.4 2000/10/22 16:15:29 wojtek2
''' wiodce (spacje, zera etc.)->pocztkowe
''' kontrolne (znaki, sekwencje)->sterujce
''' take "klawisze kontrolne" (Ctrl+klaw.)->klawisze sterujce
'''
''' Revision 1.3 1999/10/10 17:31:19 wojtek2
''' doniesienie->odniesienie. Bez polityki.
'''
''' Revision 1.2 1999/10/10 13:23:09 pborys
''' gramatyka
'''
''' Revision 1.1 1999/10/08 23:24:35 wojtek2
''' uff, pewnie nie bardziej czytelny ni orygina
'''
'''
.de Sh
.br
.if t .Sp
.ne 5
.PP
\fB\\$1\fR
.PP
..
.de Sp
.if t .sp .5v
.if n .sp
..
.de Ip
.br
.ie \\n(.$>=3 .ne \\$3
.el .ne 3
.IP "\\$1" \\$2
..
.de Vb
.ft CW
.nf
.ne \\$1
..
.de Ve
.ft R
.fi
..
'''
'''
''' Set up \*(-- to give an unbreakable dash;
''' string Tr holds user defined translation string.
''' Bell System Logo is used as a dummy character.
'''
.tr \(*W-|\(bv\*(Tr
.ie n \{\
.ds -- \(*W-
.ds PI pi
.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
.ds L" ""
.ds R" ""
''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of
''' \*(L" and \*(R", except that they are used on ".xx" lines,
''' such as .IP and .SH, which do another additional levels of
''' double-quote interpretation
.ds M" """
.ds S" """
.ds N" """""
.ds T" """""
.ds L' '
.ds R' '
.ds M' '
.ds S' '
.ds N' '
.ds T' '
'br\}
.el\{\
.ds -- \(em\|
.tr \*(Tr
.ds L" ``
.ds R" ''
.ds M" ``
.ds S" ''
.ds N" ``
.ds T" ''
.ds L' `
.ds R' '
.ds M' `
.ds S' '
.ds N' `
.ds T' '
.ds PI \(*p
'br\}
.\" If the F register is turned on, we'll generate
.\" index entries out stderr for the following things:
.\" TH Title
.\" SH Header
.\" Sh Subsection
.\" Ip Item
.\" X<> Xref (embedded
.\" Of course, you have to process the output yourself
.\" in some meaninful fashion.
.if \nF \{
.de IX
.tm Index:\\$1\t\\n%\t"\\$2"
..
.nr % 0
.rr F
.\}
.TH PERLREF 1 "perl 5.005, patch 03" "27 marca 1999" "Podrcznik programisty Perla"
.UC
.if n .hy 0
.if n .na
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.de CQ \" put $1 in typewriter font
.ft CW
'if n "\c
'if t \\&\\$1\c
'if n \\&\\$1\c
'if n \&"
\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
'.ft R
..
.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
. \" AM - accent mark definitions
.bd B 3
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds ? ?
. ds ! !
. ds /
. ds q
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
.ds oe o\h'-(\w'o'u*4/10)'e
.ds Oe O\h'-(\w'O'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds v \h'-1'\o'\(aa\(ga'
. ds _ \h'-1'^
. ds . \h'-1'.
. ds 3 3
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
. ds oe oe
. ds Oe OE
.\}
.rm #[ #] #H #V #F C
.SH NAZWA
perlref \- odwoania i zagniedone struktury danych w Perlu
.SH UWAGA
To jest pena dokumentacja dotyczca wszelkich aspektw odwoa.
Krtszy, wprowadzajcy wstp to najistotniejszych cech znajdziesz
w podrczniku \fIperlreftut\fR(1).
.SH OPIS
Przed wersj 5 Perla przedstawianie zoonych struktur danych byo trudne,
gdy wszystkie odwoania musiay by symboliczne \*-- a nawet wtedy ciko
byo odnosi si do zmiennej zamiast do pozycji w tablicy symboli.
Obecnie Perl nie tylko uatwia posugiwanie si symbolicznymi odwoaniami
do zmiennych, ale take pozwala na uycie \*(L"staych\*(R" odwoa
(hard references) do dowolnego kawaka danych lub kodu. Stae dowizanie moe
by przechowywane w dowolnym skalarze. Poniewa tablice i tablice asocjacyjne
(hasze) zawieraj skalary, to moesz teraz atwo budowa tablice tablic,
tablice haszy, hasze tablic, tablice haszy funkcji i tak dalej.
.PP
Odwoania stae s sprytne \*(-- utrzymuj za ciebie liczniki odwoa,
automatycznie zwalniajc rzecz, do ktrej odnosi si odwoanie, jeli jej
licznik odwoa zejdzie do zera. (Uwaga: liczniki odwoa dla wartoci
w strukturach danych odnoszcych si do samych na siebie (self-referential)
lub strukturach cyklicznych mog nie schodzi do zera bez pewnej drobnej pomocy;
patrz sekcja \fITwo-Phased Garbage Collection\fR w podrczniku
\fIperlobj\fR(1),
zawierajca bardziej szczegowy opis.)
Jeli taka rzecz jest obiektem, to obiekt jest niszczony. Wicej o obiektach
znajdziesz w podrczniku \fIperlobj\fR(1). (W pewnym sensie, wszystko w Perlu jest
obiektem, ale zwykle rezerwujemy to sowo dla odwoa do obiektw, ktre
zostay oficjalnie "pobogosawione" (\*(L"blessed\*(R") [tj.zakwalifikowane
jako obiekty] w pakiecie klasy.)
.PP
Odwoania symboliczne s nazwami zmiennych lub innych obiektw; zupenie tak jak
dowizania symboliczne (symbolic links) w uniksowym systemie plikw zawieraj
wycznie nazw pliku. Notacja \f(CW*glob\fR jest rodzajem odwoania
symbolicznego.
(Odwoania symboliczne nazywane s czasami \*(L"soft references\*(R"
[odwoaniami mikkimi, w przeciwiestwie do "hard r."-"twardych"], ale prosz
nie nazywaj ich tak; odwoania s wystarczajco zbijajce z pantayku bez
zbdnych synonimw.)
.PP
W przeciwiestwie do nich, odwoania stae przypominaj dowizania stae
(hard links) uniksowego systemu plikw: su do udostpniania obiektu bez
zwracania uwagi na to, jaka jest jego (inna) nazwa. Tam, gdzie uyto sowa
\*(L"odwoanie\*(R" bez przymiotnika, jak w poniszym akapicie, mwi si
zwykle o odwoaniu staym.
.PP
W Perlu odwoania s atwe w uyciu. Jest tylko jedna nadrzdna zasada:
Perl nie wykonuje niejawnego odwoywania bd dereferowania odwoa.
[Dereferencing: odniesienie si z powrotem do obiektu, rzeczy na ktr wskazuje
odwoanie].
Gdy skalar przechowuje odwoanie, to zawsze zachowuje si jak zwyky skalar.
Nie zaczyna magicznie by tablic, haszem czy procedur; musisz wprost nakaza
takie zachowanie, wykonujc dereferencj.
.Sh "Tworzenie odwoa"
Odwoania mog by tworzone na kilka sposobw.
.Ip "1." 4
Przez zastosowanie operatora odwrconego ukonika do zmiennej, procedury
lub wartoci. (Dziaa to bardzo podobnie do operatora & (zwracajcego adres)
w jzyku C.) Zauwa, e konstrukcja ta tworzy \fI\s-1KOLEJNE\s0\fR odwoanie
do zmiennej, gdy w tablicy symboli istnieje ju odwoanie do tej zmiennej.
Jednak odwoanie z tablicy symboli moe znikn, a nadal bdziesz mie
odwoanie, ktre zwrci odwrcony ukonik. Oto kilka przykadw:
.Sp
.Vb 5
\& $scalarref = \e$foo;
\& $arrayref = \e@ARGV;
\& $hashref = \e%ENV;
\& $coderef = \e&handler;
\& $globref = \e*foo;
.Ve
Przy uyciu operatora odwrconego ukonika nie jest moliwe utworzenie
prawdziwego odwoania do uchwytu \s-1IO\s0 (uchwytu pliku lub katalogu).
Moesz co najwyej uzyska odwoanie do typeglob bdcego faktycznie penym
wpisem w tablicy symboli. (Przeczytaj jednak poniej objanienie skadni
\f(CW*foo{CO}\fR.) Mimo to, moesz nadal uywa typeglob i odwoa do nich
jakby byy one uchwytami \s-1IO\s0.
.Ip "2." 4
Odwoanie do anonimowej tablicy mona stworzy posugujc si nawiasami
kwadratowymi:
.Sp
.Vb 1
\& $arrayref = [1, 2, ['a', 'b', 'c']];
.Ve
Utworzylimy odwoanie do anonimowej tablicy trzech elementw, ktrej ostatni
element jest z kolei odwoaniem do innej anonimowej tablicy trzech elementw.
(Dostp do niej umoliwi opisana dalej skadnia tablic wielowymiarowych.
Na przykad, dla powyszego przykadu \f(CW$arrayref->[2][1]\fR zwraca warto
\*(L"b\*(R".)
.Sp
Zauwa, e stworzenie odwoania do listy wyliczanej nie jest tym samym,
co uycie nawiasw kwadratowych. Jest to natomiast tym samym, co stworzenie
listy odwoa!
.Sp
.Vb 2
\& @list = (\e$a, \e@b, \e%c);
\& @list = \e($a, @b, %c); # to samo!
.Ve
W przypadku szczeglnym, \f(CW\e(@foo)\fR zwraca list odwoa do zawartoci
\f(CW@foo\fR, nie za odwoanie do samej \f(CW@foo\fR. Podobnie jest dla
\f(CW%foo\fR, z wyjtkiem tego, e odwoania-klucze odnosz si do kopii
(gdy klucze s acuchami znakowymi, a nie dowolnymi skalarami).
.Ip "3." 4
Odwoanie do anonimowej tablicy asocjacyjnej (hasza) mona utworzy uywajc
nawiasw klamrowych:
.Sp
.Vb 4
\& $hashref = {
\& 'Adam' => 'Ewa',
\& 'Clyde' => 'Bonnie',
\& };
.Ve
Powysze konstruktory anonimowych haszy i tablic mona swobodnie czy.
Umoliwia to otrzymywanie dowolnie skomplikowanych struktur.
Opisana skadnia wielowymiarowych tablic/haszy dziaa take dla nich.
Wartoci w powyszym przykadzie byy literaami, ale rwnie dobrze mogyby by
zmiennymi czy wyraeniami, gdy perlowe operatory przypisania (nawet wewntrz
\fIlocal()\fR czy \fImy()\fR) s wykonywalnymi instrukcjami, a nie jedynie
deklaracjami dla fazy kompilacji.
.Sp
Poniewa nawiasy klamrowe su do kilku innych rzeczy, a take do tworzenia
BLOKw, moesz by czasem zmuszony do uniknicia dwuznacznoci tych nawiasw
na pocztku instrukcji. Wystarczy wwczas umieszczenie przed nimi \f(CW+\fR
lub \f(CWreturn\fR, by Perl zorientowa si, e otwierajcy nawias klamrowy
nie rozpoczyna \s-1BLOK\s0u. Oszczdno i zalety mnemoniczne uycia nawiasw
klamrowych warte s takiego sporadycznego zamieszania.
.Sp
Na przykad, jeli chciaby, by funkcja tworzya nowy hasz i zwracaa
odwoanie do niego, to masz takie moliwoci:
.Sp
.Vb 3
\& sub hashem { { @_ } } # le, ale bez komunikatu o bdzie
\& sub hashem { +{ @_ } } # ok
\& sub hashem { return { @_ } } # ok
.Ve
Z drugiej strony, jeli chcesz drugiego znaczenia nawiasw (blok), zrb tak:
.Sp
.Vb 3
\& sub showem { { @_ } } # dwuznaczne (obecnie ok, ale moe si zmieni)
\& sub showem { {; @_ } } # ok
\& sub showem { { return @_ } } # ok
.Ve
Zwr uwag, e pocztkowe \f(CW+{\fR i \f(CW{;\fR zawsze su do wykluczenia
dwuznacznoci wyraenia, aby znaczyo albo odwoanie do \s-1HASZ\s0a albo
\s-1BLOK\s0.
.Ip "4." 4
Mona utworzy odwoanie do anonimowej procedury uywajc \f(CWsub\fR bez nazwy
procedury:
.Sp
.Vb 1
\& $coderef = sub { print "Bums!\en" };
.Ve
Zwr uwag na obecno rednika. Poza faktem, e wewntrzny kod nie jest
wykonywany natychmiast, \f(CWsub {}\fR jest bardziej operatorem ni deklaracj,
podobnie zreszt jak \f(CWdo{}\fR czy \f(CWeval{}\fR. (Jednak, niezalenie
od tego, ile razy wykonasz powysz lini (chyba e jeste wewntrz
\f(CWeval("...")\fR), \f(CW$coderef\fR wci bdzie zawiera odwoanie do
\fI\s-1TEJ SAMEJ\s0\fR anonimowej procedury.)
.Sp
Procedury anonimowe dziaaj jak zamknicia (closures) w odniesieniu do
zmiennych \fImy()\fR, to znaczy, zmiennych widocznych leksykalnie
w biecym zakresie. Zamknicie jest pojciem ze wiata Lispa, mwicym, e
jeli zdefiniujesz anonimow funkcj w konkretnym kontekcie leksykalnym, to
bdzie ona dziaa w tym kontekcie nawet jeli zostaa wywoana poza nim.
.Sp
Mwic po ludzku, jest to zabawny sposb przesyania argumentw do procedury
zarwno gdy j definiujesz jak i wtedy gdy j wywoujesz. Przydaje si to do
tworzenia maych fragmentw kodu do pniejszego uruchamiania, jak np. wywoania
wsteczne (callbacks). Przy ich pomocy moesz robi nawet rzeczy zorientowane
obiektowo, cho Perl zapewnia ju odmienny mechanizm operowania obiektami
\*(--patrz podrcznik \fIperlobj\fR(1).
.Sp
Moesz rwnie myle o zamkniciach jak o sposobie pisania szablonw bez
uywania eval. (Faktycznie, w wersji 5.000, eval byo \fIjedyn\fR metod
uzyskania zamkni. Jeli posugujesz si zamkniciami, moesz potrzebowa
\*(L"require 5.001\*(R".)
.Sp
A to may przykad tego, jak dziaaj zamknicia:
.Sp
.Vb 6
\& sub newprint {
\& my $x = shift;
\& return sub { my $y = shift; print "$x, $y!\en"; };
\& }
\& $h = newprint("Howdy");
\& $g = newprint("Greetings");
.Ve
.Vb 1
\& # czas mija...
.Ve
.Vb 2
\& &$h("world");
\& &$g("earthlings");
.Ve
Drukuje to
.Sp
.Vb 2
\& Howdy, world!
\& Greetings, earthlings!
.Ve
Zwr uwag szczeglnie na to, e \f(CW$x\fR nadal odnosi si do wartoci
przesanej do \fInewprint()\fR, \fImimo e\fR zmienna \*(L"my \f(CW$x\fR\*(R"
pozornie wysza poza swj zakres, w momencie gdy wywoano anonimow
procedur. O to wanie chodzi w zamkniciu.
.Sp
Przy okazji: odnosi si do tylko do zmiennych leksykalnych. Zmienne dynamiczne
dziaaj nadal tak jak zawsze. Zamknicie nie jest czym, o co musiaaby si
martwi wikszo programistw Perla.
.Ip "5." 4
Odwoania czsto zwracane s przez specjalne procedury zwane konstruktorami.
Obiekty w Perlu s po prostu odwoaniami do specjalnego rodzaju obiektu, ktry
wie z ktrym pakietem jest zwizany. Konstruktory s specjalnymi
procedurami, ktre wiedz jak utworzy to powizanie.
Robi to zaczynajc od zwykego odwoania, i pozostaje ono zwykym odwoaniem
nawet wtedy gdy jest rwnoczenie obiektem. Konstuktory czsto nazywane s
\fInew()\fR i wywoywane nie wprost:
.Sp
.Vb 1
\& $objref = new Psisko (Ogon => 'krtki', Uszy => 'dugie');
.Ve
Ale nie musz by:
.Sp
.Vb 1
\& $objref = Psisko->new(Ogon => 'krtki', Uszy => 'dugie');
.Ve
.Vb 2
\& use Term::Cap;
\& $terminal = Term::Cap->Tgetent( { OSPEED => 9600 });
.Ve
.Vb 4
\& use Tk;
\& $main = MainWindow->new();
\& $menubar = $main->Frame(-relief => "raised",
\& -borderwidth => 2)
.Ve
.Ip "6." 4
Odwoania odpowiedniego typu mog by powoywane do istnienia jeli
dereferencjonujesz je w kontekcie zakadajcym, e istniej. Poniewa jeszcze
nie mwilimy o dereferencji, nie moemy na razie pokaza przykadw.
.Ip "7." 4
Odwoanie moe by utworzone przy pomocy specjalnej skadni, uroczo zwanej
skadni *foo{\s-1CO\s0}. *foo{\s-1CO\s0} zwraca odwoanie do przegrdki
\s-1CO\s0 w *foo (ktre jest pozycj w tablicy symboli przechowujc wszystko
znane jako foo.)
.Sp
.Vb 6
\& $scalarref = *foo{SCALAR};
\& $arrayref = *ARGV{ARRAY};
\& $hashref = *ENV{HASH};
\& $coderef = *handler{CODE};
\& $ioref = *STDIN{IO};
\& $globref = *foo{GLOB};
.Ve
Wszystkie powysze wyraenia s oczywiste, z wyjtkiem *foo{\s-1IO\s0}.
Zwraca ono uchwyt \s-1IO\s0, uywany jako uchwyt pliku (patrz opis \f(CWopen\fR
w podrczniku \fIperlfunc\fR(1)), gniazdo (opis \f(CWsocket\fR oraz
\f(CWsocketpair\fR w \fIperlfunc\fR(1)) lub uchwyt katalogu (\f(CWopendir\fR
w \fIperlfunc\fR(1)). Dla zgodnoci z poprzednimi wersjami Perla,
*foo{\s-1UCHWYTPLIKU\s0} jest synonimem *foo{\s-1IO\s0}.
.Sp
*foo{\s-1CO\s0} zwraca undef jeli dane \s-1CO\s0 jeszcze nie byo uywane,
z wyjtkiem dla skalarw. Jeli nie uywano jeszcze \f(CW$foo\fR,
*foo{\s-1SKALAR\s0} zwraca odwoanie do anonimowego skalara.
W przyszych wersjach moe si to zmieni.
.Sp
*foo{\s-1IO\s0} jest alternatyw dla mechanizmu \e*\s-1UCHWYTU\s0 opisanego
w sekcji \fITypeglobs and Filehandles\fR podrcznika \fIperldata\fR(1),
a sucego do przesyania uchwytw plikw do i z procedur lub przechowywania
w wikszych strukturach danych. Jego wad jest to, e nie utworzy za Ciebie
nowego uchwytu pliku. Zalet za, e nie ryzykujesz wicej ni zamierzae
przy przypisaniem typeglob, cho jeli wykonasz przypisanie do skalara zamiast
do typeglob, to te dobrze.
.Sp
.Vb 2
\& splutter(*STDOUT);
\& splutter(*STDOUT{IO});
.Ve
.Vb 4
\& sub splutter {
\& my $fh = shift;
\& print $fh "her um well a hmmm\en";
\& }
.Ve
.Vb 2
\& $rec = get_rec(*STDIN);
\& $rec = get_rec(*STDIN{IO});
.Ve
.Vb 4
\& sub get_rec {
\& my $fh = shift;
\& return scalar <$fh>;
\& }
.Ve
.Sh "Posugiwanie si odwoaniami"
To tyle o tworzeniu odwoa. Teraz pewnie nie moesz si doczeka wiedzy
jak posugiwa si odwoaniami, by mc wrci do swych lecych odogiem
danych. Oto kilka podstawowych sposobw.
.Ip "1." 4
Wszdzie, gdzie postawiby identyfikator (lub acuch identyfikatorw)
jako cz nazwy zmiennej czy procedury, moesz zastpi identyfikator
prost zmienn skalarn zawierajc odwoanie poprawnego typu:
.Sp
.Vb 6
\& $bar = $$scalarref;
\& push(@$arrayref, $nazwapliku);
\& $$arrayref[0] = "stycze";
\& $$hashref{"KLUCZ"} = "WARTO";
\& &$coderef(1,2,3);
\& print $globref "wynik\en";
.Ve
Wane jest, by zrozumie, e nie \fI\s-1NIE\s0\fR wykonujemy tu specjalnie
dereferencji \f(CW$arrayref[0]\fR czy \f(CW$hashref{"KLUCZ"}\fR.
Dereferencja zmiennej skalarnej odbywa si \fI\s-1PRZED\s0\fR przeszukaniem
klucza (indeksu tablicy). Wszystko bardziej skomplikowane ni dereferencja
prostej zmiennej skalarnej wymaga uycia niej opisanych metod 2 lub 3.
Jednak okrelenie \*(L"prosty skalar\*(R" obejmuje te identyfikator, ktry
sam uywa rekurencyjnie metody 1. Zatem ponisze drukuje \*(L"witaj\*(R".
.Sp
.Vb 2
\& $refrefref = \e\e\e"witaj";
\& print $$$$refrefref;
.Ve
.Ip "2." 4
Wszdzie, gdzie postawiby identyfikator (lub acuch identyfikatorw)
jako cz nazwy zmiennej czy procedury, moesz zastpi identyfikator
\s-1BLOK\s0iem zwracajcym odwoanie poprawnego typu. Inaczej mwic,
poprzednie przykady mog zosta zapisane tak:
.Sp
.Vb 6
\& $bar = ${$scalarref};
\& push(@{$arrayref}, $nazwapliku);
\& ${$arrayref}[0] = "stycze";
\& ${$hashref}{"KLUCZ"} = "WARTO";
\& &{$coderef}(1,2,3);
\& $globref->print("wynik\en"); # jeli zaadowano IO::Handle
.Ve
Niewtpliwie, uycie nawiasw klamrowych w tym przypadku nie jest zbyt mdre,
ale \s-1BLOK\s0 moe zawiera dowolne wyraenie, w szczeglnoci wyraenia
indeksowane:
.Sp
.Vb 1
\& &{ $dispatch{$index} }(1,2,3); # wywoaj waciw obsug
.Ve
Z powodu moliwoci pomijania nawiasw klamrowych dla prostych przypadkw
\f(CW$$x\fR, ludzie czsto popeniaj bd postrzegania symboli dereferencji
jako prawdziwych operatorw i zastanawiaj si nad ich priorytetem.
Gdyby nimi byy, mgby uywa zwykych nawiasw zamiast klamrowych.
Tak jednak nie jest. Rozwa ponisz rnic: przypadek 0 jest skrcon wersj
przypadku 1, \fI\s-1NIE\s0\fR przypadku 2:
.Sp
.Vb 4
\& $$hashref{"KLUCZ"} = "WARTO"; # przypadek 0
\& ${$hashref}{"KLUCZ"} = "WARTO"; # przypadek 1
\& ${$hashref{"KLUCZ"}} = "WARTO"; # przypadek 2
\& ${$hashref->{"KLUCZ"}} = "WARTO"; # przypadek 3
.Ve
Przypadek 2 jest rwnie mylcy, gdy odnosi si do zmiennej o nazwie
\f(CW%hashref\fR, nie za dereferencjonuje poprzez \f(CW$hashref\fR
hasza, na ktry wydawaoby si wskazuje skalar. To robi przypadek 3.
.Ip "3." 4
Wywoania procedur i poszukiwanie poszczeglnych elementw tablic pojawiaj
si wystarczajco czsto, by zastosowanie do nich metody 2 stao si
niewygodne. Jako form "osodzenia skadni", przykady z metody 2 mona
zapisa:
.Sp
.Vb 3
\& $arrayref->[0] = "stycze"; # element tablicy
\& $hashref->{"KLUCZ"} = "WARTO"; # element hasza
\& $coderef->(1,2,3); # wywoanie procedury
.Ve
Lewa strona strzaki moe by dowolnym wyraeniem zwracajcym odwoanie,
cznie z uprzedni dereferencj. [Uatwia to operowanie odwoaniami
do zmiennych zawierajcych kolejne odwoania, jak poniej].
Zauwa, e \f(CW$array[$x]\fR \fI\s-1NIE\s0\fR jest tu tym samym co
\f(CW$array->[$x]\fR:
.Sp
.Vb 1
\& $array[$x]->{"foo"}->[0] = "stycze";
.Ve
Jest to jeden z przypadkw wspomnianych wczeniej, gdzie odwoania zaistniej,
gdy zostan uyte w kontekcie l-wartoci. Przed t instrukcj,
element \f(CW$array[$x]\fR mg by niezdefiniowany. W takim przypadku, jest on
definiowany automatycznie z nadaniem mu wartoci -- odwoania do hasza, tak e
moemy poszukiwa w haszu elementu o kluczu \f(CW"foo"\fR.
Podobnie klucz \f(CW$array[$x]->{"foo"}\fR zostanie automatycznie zdefiniowany
z rwnoczesnym nadaniem wartoci -- odwoania do tablicy, zatem bdzie mona
w niej odnale \f(CW[0]\fR. Proces ten zwany jest \fIautovivification\fR
(automatyczne oywianie).
.Sp
Jeszcze jedno. \fI\s-1POMIDZY\s0\fR indeksami umieszczonymi w nawiasach
klamrowych strzaka jest opcjonalna, zatem moemy skrci powyszy zapis do:
.Sp
.Vb 1
\& $array[$x]{"foo"}[0] = "stycze";
.Ve
Co, w szczeglnym przypadku dziaania tylko na zwykych tablicach, daje
tablice wielowymiarowe z zapisem jak w C:
.Sp
.Vb 1
\& $score[$x][$y][$z] += 42;
.Ve
No dobrze, tak naprawd, nie cakiem jak tablice w C. C nie wie, jak poszerza
tablice na danie. Perl to potrafi.
.Ip "4." 4
Jeeli odwoanie jest odwoaniem do obiektu, to prawdopodobnie istniej metody
dostpu do wskazywanych przez nie rzeczy, i powiniene zapewne z nich
skorzysta, chyba e jeste w pakiecie klasy definiujcej metody tego obiektu
i pracujesz nad nimi.
Inaczej mwic, bd tak dobry i nie naruszaj hermetyzacji bez istotnego
powodu. Perl nie wymusza hermetyzacji. Nie jestemy tu totalitarystami.
Oczekujemy jednak zachowania podstawowych zasad uprzejmoci.
.PP
Mona posuy si operatorem \fIref()\fR do stwierdzenia, na jaki typ rzeczy
wskazuje odwoanie. Zobacz podrcznik \fIperlfunc\fR(1).
.PP
Operator \fIbless()\fR moe by uywany do powizania obiektu, na ktry
wskazuje odwoanie, z pakietem funkcjonujcym jako klasa obiektowa.
Zobacz podrcznik \fIperlobj\fR(1).
.PP
Typeglob moe by dereferencjowane w ten sam sposb jak odwoanie, gdy
skadnia dereferencji zawsze wskazuje na podany rodzaj odwoania.
Zatem \f(CW${*foo}\fR i \f(CW${\e$foo}\fR wskazuj na t sam zmienn skalarn.
.PP
A oto sztuczka do interpolacji wywoania procedury w acuchu:
.PP
.Vb 1
\& print "Procedura mysub tym razem zwrcia @{[mysub(1,2,3)]} .\en";
.Ve
Dziaa to w tak, e gdy \f(CW@{...}\fR znalezione zostanie wewntrz acucha
w cudzysowach to zostanie potraktowane jako blok. Blok ten tworzy odwoanie
do jednoelementowej anonimowej tablicy zawierajcej wynik wywoania
\f(CWmysub(1,2,3)\fR [odwoanie to utworzone bdzie dziki nawiasom
kwadratowym].
Zatem cay blok zwraca odwoanie do tablicy, ktra nastpnie podlega
dereferencji powodowanej przez \f(CW@{...}\fR. Jej warto, jako umieszczona
w acuchu w cudzysowach podlega interpolacji w napis.
Takie szykany przydaj si take w dowolnych wyraeniach:
.PP
.Vb 1
\& print "That yields @{[$n + 5]} widgets\en";
.Ve
.Sh "Odwoania symboliczne"
Powiedzielimy, e niezdefiniowane cele odwoania w razie potrzeby zaistniej
[podczas dereferencji].
Nie mwilimy jednak, co si dzieje, gdy warto uyta jako odwoanie jest
ju zdefiniowana, ale \fI\s-1NIE \s0JEST\fR odwoaniem staym. Jeeli uyjesz
odwoania w takim przypadku, to bdzie ono potraktowane jak odwoanie
symboliczne. To znaczy, wartoci skalara zostanie \fI\s-1NAZWA\s0\fR zmiennej
a nie bezporednie dowizanie do (by moe anonimowej) wartoci.
.PP
Niektrzy czsto spodziewaj si, e dziaa to jako tak. I rzeczywicie.
.PP
.Vb 9
\& $name = "foo";
\& $$name = 1; # ustawia $foo
\& ${$name} = 2; # ustawia $foo
\& ${$name x 2} = 3; # ustawia $foofoo
\& $name->[0] = 4; # ustawia $foo[0]
\& @$name = (); # czyci @foo
\& &$name(); # wywouje &foo() (jak w Perl 4)
\& $pack = "THAT";
\& ${"${pack}::$name"} = 5; # ustawia $THAT::foo bez rozwinicia(eval)
.Ve
Jest to bardzo silne narzdzie, ale nieco niebezpieczne, gdy moliwe jest,
ze szczerym zamiarem uycia odwoania staego, przypadkowe uycie
symbolicznego. Moesz si przed tym uchroni piszc:
.PP
.Vb 1
\& use strict 'refs';
.Ve
a dla reszty otaczajcego bloku bd dozwolone tylko odwoania stae.
Wewntrzny blok moe si temu sprzeciwi przy pomocy
.PP
.Vb 1
\& no strict 'refs';
.Ve
Dla odwoa symbolicznych widoczne s tylko zmienne pakietu (globalne, nawet
jeli lokalnie). Zmienne leksykalne (deklarowane przy pomocy \fImy()\fR) nie
zawieraj si w tablicy symboli, zatem s niewidoczne dla tego mechanizmu.
Na przykad:
.PP
.Vb 6
\& local $wartosc = 10;
\& $ref = "wartosc";
\& {
\& my $wartosc = 20;
\& print $$ref;
\& }
.Ve
Nadal bdzie drukowa 10, a nie 20. Pamitaj, e \fIlocal()\fR dziaa
na zmienne pakietu, ktre dla samego pakietu wszystkie s \*(L"globalne\*(R".
.Sh "Odwoania niezbyt symboliczne"
.\" "Not-so-symbolic references"
Now cech poprawiajc czytelno, wprowadzon w perlu wersji 5.001, jest
to, e nawiasy wok odwoania symbolicznego zachowuj si jak znaki
cudzysowu, czyli tak, jakby zawsze zawieray wewntrz acuch. To znaczy, e
.PP
.Vb 2
\& $push = "pop on ";
\& print "${push}over";
.Ve
miao zawsze znaczenie wydrukowania \*(L"pop on over\*(R", bez wzgldu
na fakt, e "push" jest sowem zarezerwowanym. Zostao to uoglnione tak, by
dziaa rwnie poza cudzysowami, zatem
.PP
.Vb 1
\& print ${push} . "over";
.Ve
a nawet
.PP
.Vb 1
\& print ${ push } . "over";
.Ve
maj ten sam rezultat. (Spowodowaoby to bd skadni w Perlu 5.000, cho
Perl 4 dopuszcza co takiego w postaci bez odstpw.) Zauwa, e konstrukcja ta
\fInie\fR nie jest uwaana za odwoanie symboliczne gdy uywasz strict refs:
.PP
.Vb 3
\& use strict 'refs';
\& ${ bareword }; # dobrze, znaczy $bareword.
\& ${ "bareword" }; # bd, odwoanie symboliczne.
.Ve
Podobnie, z powodu wszelkiego indeksowania przy pomocy pojedynczych sw,
zastosowalimy t sam regu do kadego z goych sw uytego do indeksowania
hasza. Zatem teraz, zamiast
.PP
.Vb 1
\& $array{ "aaa" }{ "bbb" }{ "ccc" }
.Ve
moesz napisa po prostu
.PP
.Vb 1
\& $array{ aaa }{ bbb }{ ccc }
.Ve
i nie martwi si o to, czy indeksy s sowami zarezerwowanymi. W tych rzadkich
przypadkach, gdy chcesz zrobi co w rodzaju
.PP
.Vb 1
\& $array{ shift }
.Ve
moesz wymusi interpretacj sowa jako zarezerwowanego dodajc cokolwiek, co
zrobi ze wicej ni goe sowo:
.PP
.Vb 3
\& $array{ shift() }
\& $array{ +shift }
\& $array{ shift @_ }
.Ve
Przecznik \fB\-w\fR bdzie Ci ostrzega, jeli zinterpretuje sowo
zarezerwowane jako acuch. Nie bdzie jednak ostrzega o uyciu sw
pisanych maymi literami, gdy acuch jest faktycznie cytowany.
.Sh "Pseudo-hasze: Uywanie tablicy jak hasza"
\s-1OSTRZEENIE\s0: Niniejsza sekcja opisuje cech eksperymentaln.
W przyszych wersjach szczegy mog ulec zmianie bez powiadomienia.
.PP
Poczwszy od Perla 5.005 moesz w pewnych kontekstach posugiwa si
odwoaniem do tablicy, mimo e normalnie wymagaj one odwoania do hasza.
Pozwala to na dostp do elementw tablicy przy uyciu nazw symbolicznych,
tak jakby byy one polami struktury.
.PP
eby to zadziaao tablica musi zawiera dodatkow informacj. Pierwszym
elementem tablicy powinno by odwoanie do hasza odwzorowujcego nazwy pl
na indeksy tablicy. Oto przykad:
.PP
.Vb 1
\& $struct = [{foo => 1, bar => 2}, "FOO", "BAR"];
.Ve
.Vb 2
\& $struct->{foo}; # to samo, co $struct->[1], tj. "FOO"
\& $struct->{bar}; # to samo, co $struct->[2], tj. "BAR"
.Ve
.Vb 2
\& keys %$struct; # zwrci ("foo", "bar") w jakiej kolejnoci
\& values %$struct; # zwrci ("FOO", "BAR") w jakiej kolejnoci
.Ve
.Vb 3
\& while (my($k,$v) = each %$struct) {
\& print "$k => $v\en";
\& }
.Ve
Jeli sprbujesz usun klucze z takiego pseudo-hasza
lub bdziesz prbowa sign do nieistniejcych pl, perl zgosi wyjtek.
W celu poprawy wydajnoci, Perl moe te wykona na etapie kompilacji
tumaczenie nazw pl na odpowiadajce im indeksy tablicy dla opisanych odwoa.
Patrz podrcznik \fIfields\fR(3).
.Sh "Szablony funkcji"
Jak wyjaniono powyej, zamknicie jest anonimow funkcj z dostpem
do zmiennych leksykalnych widocznych podczas jej kompilacji. Zachowuje ona
dostp do tych zmiennych nawet wtedy, gdy jest wykonywana pniej, tak jak
funkcja obsugi sygnau (signal handler) czy wywoanie wsteczne Tk.
.PP
Posugiwanie si zamkniciem jako szablonem funkcji umoliwia tworzenie wielu
podobnie dziaajcych funkcji. Zamy, e potrzebujesz funkcji o nazwach
pochodzcych od rnych kolorw zmieniajcych czcionk \s-1HTML\s0.
.PP
.Vb 1
\& print "Hej, ", red("uwaaj"), "na to ", green("wiato");
.Ve
Funkcje \fIred()\fR i \fIgreen()\fR bd bardzo podobne. By je stworzy,
przypiszemy zamknicie do typeglob nazwy funkcji, ktr prbujemy skonstruowa.
.PP
.Vb 5
\& @kolory = qw(red blue green yellow orange purple violet);
\& for my $nazwa (@kolory) {
\& no strict 'refs'; # pozwl na operowanie tablic symboli
\& *$nazwa = *{uc $nazwa} = sub { "<FONT COLOR='$nazwa'>@_</FONT>" };
\& }
.Ve
Teraz wszystkie te funkcje bd istnie niezalenie od siebie. Moesz wywoywa
\fIred()\fR, \fI\s-1RED\s0()\fR, \fIblue()\fR, \fI\s-1BLUE\s0()\fR,
\fIgreen()\fR, etc. Technika ta zarwno skraca czas kompilacji jak i zmniejsza
zuycie pamici, jest te mniej naraona na bdy, gdy kontrola skadni odbywa
si podczas kompilacji. Istotne jest, by wszelkie zmienne w anonimowej
procedurze byy zmiennymi leksykalnymi by stworzy poprawne zamknicie. Z tego
powodu uyto \f(CWmy\fR dla zmiennej sterujcej ptli.
.PP
Jest to jedno z jedynych miejsc, gdzie dostarczenie prototypu do zamknicia
ma sens. Jeli chciaby narzuci kontekst skalarny dla argumentw powyszych,
przykadowych funkcji (pewnie nie najlepszy pomys w tym przypadku), moesz
zapisa to inaczej:
.PP
.Vb 1
\& *$nazwa = sub ($) { "<FONT COLOR='$nazwa'>$_[0]</FONT>" };
.Ve
Jednake, poniewa sprawdzanie protypw odbywa si podczas kompilacji, powysze
przypisanie zostanie wykonane za pno, by byo przydatne. Mgby to obej
przez woenie caej ptli przypisa do wntrza bloku \s-1BEGIN\s0u, wymuszajc
wykonanie go w czasie kompilacji.
.PP
Dostp do zmiennych leksykalnych zmieniajcych typ \*(-- jak te w ptli
\f(CWfor\fR powyszego przykadu\*-- dziaa wycznie z zamkniciami, a nie
z procedurami w ogle. Zatem w przypadku oglnym, procedury nazwane nie
zagniedaj si prawidowo, cho robi to procedury anonimowe.
Jeli nawyke do uywania zagniedonych procedur z wasnymi prywatnymi
zmiennymi w innych jzykach programowania, to w Perlu bdziesz musia nad
troch popracowa. Intuicyjna metoda kodowania tego typu rzeczy spowoduje
tajemnicze ostrzeenia ``will not stay shared'\*(R' (nie pozostanie wsplne).
To, na przykad, nie zadziaa:
.PP
.Vb 5
\& sub zewn {
\& my $x = $_[0] + 35;
\& sub wewn { return $x * 19 } # LE
\& return $x + wewn();
\& }
.Ve
Obejcie jest nastpujce:
.PP
.Vb 5
\& sub zewn {
\& my $x = $_[0] + 35;
\& local *wewn = sub { return $x * 19 };
\& return $x + wewn();
\& }
.Ve
Teraz \fIwewn()\fR moe by wywoana tylko z wntrza \fIzewn()\fR, z powodu
tymczasowego przypisania zamknicia (procedury anonimowej). Ale kiedy jest
wywoywana, to ma zwyky dostp do zmiennej leksykalnej \f(CW$x\fR z zakresu
procedury \fIzewn()\fR.
.PP
Ma to interesujcy skutek tworzenia funkcji lokalnych wzgldem innych funkcji,
co normalnie nie jest obsugiwane w Perlu.
.SH OSTRZEENIE
Nie moesz (w uyteczny sposb) posuy si odwoaniem jako kluczem hasza.
Zostanie ono zamienione na acuch:
.PP
.Vb 1
\& $x{ \e$a } = $a;
.Ve
Jeli sprbujesz zdereferencjonowa klucz, nie otrzymasz odwoania staego
a acuch i nie uzyskasz tego, co prbowae. W zamian mona napisa co
podobnego do:
.PP
.Vb 2
\& $r = \e@a;
\& $x{ $r } = $r;
.Ve
a nastpnie uy \fIvalues()\fR, co zwrci rzeczywiste odwoania,
zamiast uycia \fIkeys()\fR, gdy klucze odwoaniami nie bd.
.PP
Standardowy modu Tie::RefHash umoliwia wygodny sposb obejcia tego problemu.
.SH ZOBACZ TAKE
Poza oczywist dokumentacj, pouczajca moe by analiza kodu rdowego.
Kilka raczej patologicznych przykadw uycia odwoa znajdziesz
w tecie regresji \fIt/op/ref.t\fR w katalogu rde Perla.
.PP
Zobacz rwnie podrczniki \fIperldsc\fR(1) i \fIperllol\fR(1), opisujce
posugiwanie si odwoaniami do tworzenia zoonych struktur danych, oraz
\fIperltoot\fR(1), \fIperlobj\fR(1) i \fIperlbot\fR(1) opisujce ich uycie
do tworzenia obiektw.
.rn }` ''
.IX Title "PERLREF 1"
.IX Name "perlref - odwoania i zagniedone struktury danych w Perlu"
.IX Header "NAZWA"
.IX Header "UWAGA"
.IX Header "OPIS"
.IX Subsection "Tworzenie odwoa"
.IX Item "1."
.IX Item "2."
.IX Item "3."
.IX Item "4."
.IX Item "5."
.IX Item "6."
.IX Item "7."
.IX Subsection "Uycie odwoa"
.IX Item "1."
.IX Item "2."
.IX Item "3."
.IX Item "4."
.IX Subsection "Odwoania symboliczne"
.IX Subsection "Odwoania niezbyt symboliczne"
.IX Subsection "Pseudo-hasze: uywanie tablicy jak hasza"
.IX Subsection "Szablony funkcji"
.IX Header "OSTRZEENIE"
.IX Header "ZOBACZ TAKE"
|