Basics av ActivePerl - Part 18 Innledning Dette er en del 18 av serien min, Grunnleggende om ActivePerl. En region i minne er et sett med påfølgende minneceller. Verdier (variable innhold) blir holdt i minneområder. En variabel identifiserer en minneområde. En referanse er en peker til et minneområde og brukes vanligvis når du er mer interessert i hva som er i et minneområde og ikke variabelen. Vurdere en referanse som adressen til et minneområde. Dette minnet regionen kan ha en verdi. I denne delen av serien ser vi på ActivePerl Reference.
Alt er beskrevet i denne veiledningen gjelder for tradisjonelle Perl. Merk: Hvis du ikke kan se koden, eller hvis du tror noe mangler (ødelagt kobling, bilde fraværende), bare kontakte meg på [email protected]. Det er, kontakt meg for den minste problemet du har om hva du leser. Minne Region A minneområde er et område i datamaskinens minne som inneholder verdien av en variabel. Av verdi her, er jeg henvise til en skalar verdi, array eller hash.
Ulike minneområder med ulike variabler vurdere følgende to påfølgende uttalelser: my $ myVar =; "Jeg er innholdet i en stor tekstfil fra harddisken, nå i minnet." min $ Avar = "Jeg er innholdet i en stor tekstfil fra harddisken, nå i minnet."; Du har to forskjellige variabler med forskjellige navn, men med de samme strengverdier. En variabel identifiserer en minneområde. To forskjellige variabler med to forskjellige navn identifisere to ulike minneområder, alt er likt. I det ovennevnte tilfelle, de to verdier, selv om de samme, er i to forskjellige minneområder.
Samme Memory Region for to ulike variabler I ActivePerl kan du gjøre det samme minneområde har to forskjellige variabler. De to forskjellige variabler vil selvsagt identifisere den samme verdi. Vurdere følgende påfølgende to uttalelser: my $ myVar = "Jeg er innholdet i en stor tekstfil fra harddisken, nå i minnet."; $ hisVar = \\ $ myVar min; For det første utsagnet du har en verdi tilordne variabelen, $ myVar. I den andre setningen, er $ myVar innledes med \\ skilt før de blir tildelt en ny variabel, $ hisVar. \\ Er en operatør.
I den andre setningen, den \\ operatøren, før den første variabelen, gjør andre variable identifisere den samme minneområde (samme verdi) som den første variabel. En viktig ting å merke seg her er at \\ $ myVar refererer til et minneområde. For den andre setningen, \\ $ myVar, med \\, er en referanse (adressen til minneområde identifisert av $ myVar). $ hisVar er en variabel, ikke en referanse. Vi sier $ myVar har en verdi (strengen), mens $ hisVar holder referansen (adresse).
Ved hjelp av en Reference Nå som du har en referanse, hvordan kan du få verdien av minnet regionen som en variabel refererer til? Med andre ord en variabel holder referanse av noe minne region, hvordan kan du få verdien av at minneområde, ved hjelp av variabel? I ovennevnte sak, er $ hisVar holder referansen i regionen identifisert av $ myVar. For å få verdien ved hjelp av $ myVar, er det ingen problem, fordi du må bare bruke $ myVar i stedet for verdien.
For å få verdien fra variabelen ($ hisVar), som har referanse, må du bruke {} parentes som følger: $ {$ hisVar} Her har vi å gjøre med en skalar, så du begynner med skalar tegn. Dette er etterfulgt av et par bukseseler. Inne i tannregulering, har du variabelen som holder referanse. Følgende kode illustrerer dette: bruke strenge; print "Content-Type: text /html \\ n \\ n"; min $ myVar = "Jeg er innholdet i en stor tekstfil fra harddisken, nå i minnet."; $ hisVar = \\ $ myVar min; print $ {$ hisVar}; Det er du erstatte hisVar med {$ hisVar}.
Skalar og Reference Listen forklaringen gjelder for skalarer. En lignende ting er aktuelt å arrays og hashes. Men med arrays og hashes, er det to måter å lage en referanse og to måter å bruke referanse. Array og Reference vurdere følgende matrise skapelse: minarr = ("en", "to", 3, 4); For å gjøre en henvisning avarr, må du gå foran variabelen med \\ skilt, som følgende utsagn illustrerer: my $ Aref = \\arr; Anonym Array I avsnittet over, trenger du to uttalelser i for å komme opp med en rekke referanse. Den første setningen gir tabellen et navn,arr.
Nå er det mulig å bruke bare én setning for å komme opp med en matrise. I dette tilfellet vil matrisen ikke har et navn. Det vil bare ha en referanse til regionen i minne som har rekken. Følgende utsagn illustrerer dette: min $ Aref = ["en", "to", 3, 4]; Merke seg her at vi har hakeparenteser for å avgrense oppstillingselementene og ikke buet braketter for listen som før. Under denne tilstanden, klammer returnere en referanse (minneadresse) til array. Denne referansen returnert tilordnes skalar variabel, $ Aref.
Du trenger ikke \\ skiltet her, siden matrisen ikke har et navn og \\ bør brukes foran et navn. Merk: Enhver variabel som inneholder en referanse er en skalar variabel. Så referanse til en matrise eller hash er holdt av en skalar variabel. Bruke en Array Referanse En måte å få rekken fra en rekke referanse (variabel holder referanse) er å bruke bukseseler. For de ovennevnte referanse, ville du skriver, @ {$ Aref} Du begynner med array tegnet, @, siden du har å gjøre med en matrise. Dette etterfølges av bukseseler. Inne i tannregulering, har du variabelen som holder referanse.
Du vanligvis ikke bruker matrisen som helhet (som vist ovenfor). Du bruker vanligvis et element fra tabellen. For en matrise som har et navn, hvis du ønsker å bruke array navn for å få et element, ville du skriver noe sånt, $ arr [2] hvor navnet på tabellen (variabel) erarr. Når du har en referanse til tabellen, gjør du en lignende ting, men med bukseseler som følger: $ {$ Aref} [2] Det er du erstatte, arr med {$ Aref}. Den andre måten å få tilgang til en rekke er aktuelt når du vil ha et element fra tabellen (dette er hva du gjør det meste av tiden).
Med denne måten trenger du ikke begynne med det foregående skalar tegn, $. Du kan også utelate bukseseler. Men følger du matrisen referanse variabel, med en pil, -> (minustegn etterfulgt av større enn-tegn), som i følgende eksempel: $ Aref -> [2] Ved hjelp av denne måten er ikke avhengig av hvorvidt matrisen referansen var fra en matrise som har et navn eller en anonym array.
Les og prøv følgende kode: bruke strenge; print "Content-Type: text /html \\ n \\ n"; minarr = ("en", "to", 3, 4); $ Aref = \\arr min; print $ {$ Aref} [1]; print "min $ arRef = [" en "," to ", 3, 4]; skrive ut $ arRef -> [3]; Hash og Reference vurdere følgende hash skapelse: my% ha = (Apple =>" lilla ", Banana => "gul", Pear => "grønn", Lemon => "grønn"); For å gjøre en henvisning av% ha, må du gå foran den med \\ skilt, som følgende utsagn illustrerer: my $ href = \\% ha; Anonymous Hash I avsnittet over, trenger du to uttalelser for å komme opp med en hash Den første setningen gir tabellen et navn,% ha Det er mulig å bruke bare én setning for å komme opp med en.
. ... hash I dette tilfellet vil hash ikke har et navn Den vil bare ha en referanse til regionen i minne som har hash Følgende uttalelse illustrerer dette: min $ href = {Apple => "lilla", Banana = > "gul", Pear => "grønn", Lemon => "grønn"}; Merk her at vi har tannregulering for å avgrense den stekte elementer og ikke buet braketter for listen som før Under denne tilstanden, bukseseler returnere en referanse (. minneadresse) til hasj. Denne referansen returnert tilordnes skalar variabel, $ href.
Du trenger ikke \\ skiltet her, siden hash ikke har et navn og \\ bør brukes foran et navn (variabel) for å returnere en referanse. Merk: Enhver variabel som inneholder en referanse er en skalar variabel. Så referanse til en matrise eller hash er holdt av en skalar variabel. Referansen til en skalar er fortsatt innehas av en skalar variabel. Ved hjelp av en Hash Reference En måte å få hasj fra en hash referanse (variabel holder referanse) er å bruke bukseseler. For de ovennevnte referanse, ville du skriver,% {$ Aref} Du begynner med skigard,%, siden vi har å gjøre med en hash.
Dette etterfølges av bukseseler. Inne i tannregulering, har du variabelen som holder referanse. Du vanligvis ikke bruker hasj som helhet. Du bruker vanligvis en verdi fra hasj. For en hash som har et navn, hvis du ønsker å bruke hasj navn for å få en verdi, ville du skriver noe sånt, $ ha {'key'} der navnet på hash (variabel) er $ ha. Når du har en referanse til hasj, gjør du en lignende ting, men med bukseseler som følger: $ {$ href} {'key'} Det er du erstatte, ha med {$ href}.
Den andre måten å få tilgang til en hash er aktuelt når du vil ha et element fra hash (dette er hva du gjør det meste av tiden). Med denne måten trenger du ikke begynne med det foregående skalar tegn, $. Du kan også utelate bukseseler. Men følger du matrisen referanse variabel, med en pil, ->, som i følgende eksempel: $ href -> {'key'} hjelp på denne måten er ikke avhengig av om hash referansen var fra en hash som har et navn eller en anonym hasj.
Les og prøv følgende kode: bruke strenge; print "Content-Type: text /html \\ n \\ n"; min% ha = (Apple => "lilla", Banana => "gul", Pear => "grønn", Lemon => "grønn"); min $ href = \\% ha; print $ {$ href} {'Apple'}; print "min $ haRef = {Apple =>" lilla ", Banana =>" gul ", Pear =>" grønn ", Lemon =>" grønn "}; skrive $ haRef -> {'Banana'}; Pass Argument etter referanse til en Subroutine Les og prøv følgende kode: bruke strenge; skrive ut "Content-Type: text /html \\ n \\ n"; min% hektar = (Apple => "lilla", Banana => "gul"); sub mySub {print $ _ [0], "", $ _ [1], "", $ _ [2], "", $ _ [3], "", $ _ [4], "", $ _ [5] ",";} mySub ("en", "to",% ha), I funksjonskallet, er det første argumentet "en", er det andre argumentet "to" og den tredje argument er% ha.
Så snart funksjonsdefinisjonen begynner henrettelse, "en" blir den første verdien av_; "to" blir det andre argumentet av_ Da elementer av hasj er flatet ut i resten av verdiene av_. i min datamaskin, blir Apple femte verdien av_ og dette er ikke en god idé siden Apple er faktisk en firkanttasten. lilla blir den sjette verdien av_ i min datamaskin. Banana blir den tredje verdien av_ i min datamaskin . I min datamaskin, gul blir den fjerde verdien av_. Merk at hash argument (% ha) i kall funksjonen er ikke en referanse. Dette gir opphav til to problemer. Elementene i hash er flatet ut i_ array.
Også hash elementer i_ matrisen ikke er i orden, de ble skrevet i etableringen av hasj. Et lignende problem oppstår med matrisen. For å løse dette problemet, er at for å opprettholde strukturen i en hash eller array når sendes til en funksjon, må du passere hash eller matrise som referanse. Følgende kode illustrerer dette.
bruke strenge; print "Content-Type: text /html \\ n \\ n"; min% ha = (Apple => "lilla", Banana => "gul"); sub mySub {print $ _ [0], "", $ _ [1], "", $ _ [2] -> {'Apple'}, "", $ _ [2] -> {'Banana'} ; } MySub ("en", "to", \\% ha); Det tredje argumentet i funksjonskall er en referanse til hasj. Dette ble oppnådd ved foregående hash variabelnavnet med \\ i parentes av argumentene. I gjennomføringen av funksjonsdefinisjonen, er det bare tre verdier for_ rekke nå. Den første verdien for matrisen er det første argumentet i funksjonen samtalen; det er greit.
Den andre verdien i matrisen er det andre argumentet til funksjonen samtalen; det er greit. Nå er den tredje verdien i matrisen en referanse til den hash; som er akseptert. Fra denne referansen, kan du få alle verdier av hasj. Legg merke til hvordan de to verdiene av hash ble oppfattet i den ovennevnte funksjonsdefinisjon. Når du passerer en matrise eller en hash som argument vanligvis til en funksjon, ender du opp med to kopier av elementene i matrisen eller hash: ett eksemplar av elementene forblir i matrisen eller hash variabel.
Den andre kopien av elementene er i_ array, når funksjonen kalles. I koden ovenfor, har strukturen av hasj er opprettholdt, og du har bare én kopi av hash-elementer, som er de av laget (definert) hasj. Den opprinnelige hash med sin struktur er naturligvis opprettholdes. Hvis du tildelt hash referanse til en variabel (skalar), kan du fortsatt bruke variabelen (som holder referanse) som argument i funksjonen samtalen.
Følgende kode illustrerer dette: bruke strenge; print "Content-Type: text /html \\ n \\ n"; min% ha = (Apple => "lilla", Banana => "gul"); min $ href = \\% ha; sub mySub {print $ _ [0], "", $ _ [1], "", $ _ [2] -> {'Apple'}, "", $ _ [2] ->