Transmiterea parametrilor
Informațiile într-o subrutină, iar subrutina se transmite prin parametrii (argumente). matrice specială @_ este folosit pentru a transmite parametrii unui subrutină. Toți parametrii sunt stocați în elementele de matrice $ _ [0], $ _ [1], și așa mai departe. D. Un astfel de mecanism permite să transmită în orice număr de setări subrutină. @_ matrice este locală la acest subrutina, dar elementele sale - alias-uri parametru de scalare reale, și schimbarea unui element de matrice determină o schimbare @_ real al parametrului corespunzător. În limbaje de programare face distincția între trecere de referință și de valoare. Când se trece parametrii de subrutină valoare devine o copie a variabilei. Schimbarea de copii în cadrul subrutina nu afectează sursa inițială. Când trimiteți parametrii de legătură ai subrutina are acces la cele mai variabile și se poate schimba. Transmiterea parametrilor printr-o matrice de dedicat @_ parametri de fapt, o legătură de transmisie. Într-un limbaj Perl poate pune în aplicare parametru care trece prin valoare, în cazul în care în interiorul unui subrutină folosind meu () declara variabile locale și să le atribuie valorile parametrilor actuali ai @_ matrice, la fel ca în exemplul următor (Listing 9.3): Listarea 9.3. Folosind Mu () pentru transmiterea de parametri semnificativ rezultat execuție:
Matricele parametru de referință
Deci, rutina primește și returnează parametrii printr-o matrice specială @_. Dacă parametrul este o matrice matrice sau hash, elementele sale sunt, de asemenea, stocate în parametrul matrice @_. La transferul la subrutina de mai mulți parametri matrice sau hash-uri, își pierd integritatea lor. Cu alte cuvinte, după înregistrarea parametrilor de matrice (matrice hash) în matrice @_ din acestea imposibil de a aloca o matrice separat parametru (hash matrice) toți parametrii sunt stocate în matrice @_ singur „haldă.“ Pentru a păstra integritatea în transmiterea de rutină a unei matrice sau hash-matrice, ar trebui să utilizați una dintre cele două principale abordări existente.
Utilizarea de tip typeglob
În primul rând, mai în vârstă, este de a utiliza tipul de date intern numit typeglob. Aparținând typeglob tip identificat prin prefixul *. Prefixul * poate fi privit ca un wildcard, în loc de care nu poate fi oricare dintre $ prefixul, @,%, Indicând tipul de date „scalar“, „matrice“, „hash matrice“, „funcție“, respectiv. Interpretorul convertește tip typeglob variabilă, de exemplu * abc, o valoare scalară, care este o referință la fanta din tabela de simboluri, care cuprinde elemente de tipuri diferite având același nume abc, și reprezintă oricare dintre aceste elemente. De exemplu, înregistrarea * abc reprezintă totalitatea, precum și oricare dintre următoarele variabile: $ abc scalar, matrice @abc, un hash% abc, funcția de ABC. Se transferă într-o subrutină în schimb parametru matrice sau matrice hash tip typeglob variabilă corespunzătoare este simulată de transmisie-parametru matrice (hash matrice) link menținând în același timp integritatea. Luați în considerare exemplul din Listing 9.4. Listarea 9.4. Utilizarea tip typeglob pentru transmiterea parametrilor și matrice matrice hash doublargs subrutina recepționează matrice de intrare și de hash și modifică elementele de matrice, înmulțirea cu 2. In loc de matrice și matrice hash în subrutina transmise variabile de tip corespunzător typeglob, care sunt ușor separate de matrice @ _ ca, de fapt, acestea sunt scalari. Notă utilizarea funcțiilor locale. Utilizați în schimb funcția mea () este imposibilă, deoarece tipul typeglob variabilă nu poate fi locală, este același nume câteva variabile de diferite tipuri în tabela de simboluri. În continuare, se pune întrebarea, modul în care o schimbare în influente matrice de rutină @mylist schimba parametrul @somelist actuale. Faptul că operarea unei cesiuni a formularului * = x * y * x creează un sinonim pentru simbolul cuib de masă * y, astfel încât punerea în aplicare a operațiunilor de pe $ x @ x, x% este echivalent cu punerea în aplicare a operațiunilor de peste $ y @ y% în . Ca urmare a cesiunii creează un alias pentru mylist * * somelist, prin urmare, toate modificările elementelor @mylist matrice în subrutina este echivalentă cu schimbarea elementelor de matrice @somelist. Toate cele de mai sus este valabil pentru matrice hash% myhash și% somehash. Rezultatul confirmă corectitudinea matrice de transmisie și matrice hash prin link: Valorile inițiale: Totaluri: