Bases de ActivePerl - Partie 18 Introduction Ceci est la partie 18 de ma série, Bases de ActivePerl. Une région en mémoire est un ensemble de cellules de mémoire consécutifs. Valeurs (contenus variables) sont conservés dans les régions de mémoire. Une variable identifie une région de mémoire. Une référence est un pointeur vers une région de mémoire et est généralement utilisé lorsque vous êtes plus intéressé par ce qui est dans une région de mémoire et non la variable. Envisager une référence que l'adresse d'une région de la mémoire. Cette zone de mémoire peut avoir une valeur.
Dans cette partie de la série, nous regardons ActivePerl référence. Tout décrite dans ce tutoriel est applicable à Perl traditionnelle. Remarque: Si vous ne pouvez pas voir le code ou si vous pensez que quelque chose manquait (lien brisé, l'image absente), contactez-moi au [email protected]. Qui est, me contacter pour le moindre problème que vous avez à propos de ce que vous lisez. Mémoire région une zone de mémoire est une zone dans la mémoire de l'ordinateur qui contient la valeur d'une variable. En valeur ici, je me réfère à une valeur scalaire, tableau ou de hachage.
Différentes régions de mémoire avec différentes variables examiner les deux déclarations consécutives suivant: my $ myVar =; "Je suis le contenu d'un fichier de grande taille de texte à partir du disque dur, maintenant dans la mémoire." my $ Avar = "Je suis le contenu d'un fichier de grande taille de texte à partir du disque dur, maintenant dans la mémoire."; Vous avez deux variables différentes avec des noms différents, mais avec les mêmes valeurs de chaîne. Une variable identifie une région de mémoire.
Deux variables différentes avec deux noms différents à identifier deux régions de mémoire différentes, toutes choses étant égales. Dans le cas ci-dessus, les deux valeurs, même si sont les mêmes, se trouvent dans deux zones de mémoire différentes. Même région de mémoire pour deux différentes variables ActivePerl vous pouvez faire la même région de la mémoire ont deux variables différentes. Bien sûr, les deux variables différentes vont identifier la même valeur.
Considérons les deux déclarations consécutives suivantes: my $ myVar = "Je suis le contenu d'un fichier de grande taille de texte à partir du disque dur, maintenant dans la mémoire."; my $ hisVar = \\ $ myVar; Pour la première déclaration que vous avez une valeur attribuer à la variable, $ myVar. Dans la deuxième instruction, $ myVar est précédée du \\ signe avant d'être affecté à une nouvelle variable, $ hisVar. \\ Est un opérateur.
Dans la deuxième instruction, le \\ opérateur, qui précède la première variable, permet d'identifier la seconde variable de la même zone de mémoire (même valeur) que la première variable. Une chose importante à noter ici est que \\ $ myVar se réfère à une région de mémoire. Pour la deuxième déclaration, \\ $ myVar, avec \\, est une référence (adresse de la région de mémoire identifié par $ myVar). hisVar $ est une variable, pas une référence. Nous disons $ myVar contient une valeur (la chaîne), tandis que $ hisVar détient la référence (adresse).
En utilisant une référence Maintenant que vous avez une référence, comment pouvez-vous obtenir la valeur de la région de mémoire qui est une variable référence? En d'autres termes une variable tient la référence d'une certaine région de mémoire, comment pouvez-vous obtenir la valeur de cette région de la mémoire, en utilisant la variable? Dans le cas ci-dessus, $ hisVar tient la référence de la région identifié par $ myVar. Pour obtenir la valeur en utilisant $ myVar, il n'y a aucun problème, parce que vous avez juste à utiliser $ myVar à la place de la valeur.
Pour obtenir la valeur de la variable ($ hisVar), qui porte la référence, vous devez utiliser les accolades {} comme suit: $ {$ hisVar} Ici, nous avons affaire à un scalaire, si vous commencez avec le signe scalaire. Ceci est suivi par une paire de bretelles. Entre les accolades, vous avez la variable qui contient la référence. Le code suivant illustre cela: use strict; print "Content-Type: text /html \\ n \\ n"; my $ myVar = "Je suis le contenu d'un fichier de grande taille de texte à partir du disque dur, maintenant dans la mémoire.
"; my $ hisVar = \\ $ myVar; print $ {$ hisVar}; Voilà vous remplacez hisVar avec {$ hisVar}. Scalaire et référence Le explication ci-dessus est applicable à scalaires. Une chose semblable est applicable aux tableaux et hachages. Cependant, avec des tableaux et hachages, il ya deux façons de créer une référence et deux façons d'utiliser la référence.
Référence tableau et envisager la création de tableau suivant: monarr = ("un", "deux", 3, 4); Pour faire une référence surarr, vous devez précéder la variable avec le \\ signe, comme la déclaration suivante illustre: my $ Aref = \\arr; Tableau anonyme Dans la section ci-dessus, vous avez besoin de deux déclarations dans le but de venir avec une référence de tableau. La première déclaration donne le tableau un nom,arr. Maintenant, il est possible d'utiliser une seule instruction à venir avec un tableau. Dans ce cas, le tableau ne sera pas avoir un nom.
Il aura juste une référence à la région dans la mémoire qui a le tableau. La déclaration suivante illustre cela: my $ Aref = ["un", "deux", 3, 4]; Notez ici que nous avons des crochets pour délimiter les éléments du tableau et non pas entre accolades pour la liste comme avant. Sous cette condition, les crochets renvoient une référence (adresse de la mémoire) dans le tableau. Cette référence est affecté retourné à la variable scalaire, $ Aref. Vous ne devez pas le \\ signe ici, puisque le réseau n'a pas de nom et \\ doit être utilisé en face d'un nom.
Remarque: Toute variable qui contient une référence est une variable scalaire. Donc, la référence d'un tableau ou de hachage est tenu par une variable scalaire. Utilisant un tableau de référence Une façon d'obtenir le tableau à partir d'une référence de tableau (variable contenant la référence) est d'utiliser les accolades. Pour la référence ci-dessus, vous devez taper, @ {$ Aref} Vous commencez avec le signe de tableau, @, puisque vous avez affaire à un tableau. Ceci est suivi par des entretoises. Entre les accolades, vous avez la variable qui contient la référence.
Généralement, vous ne utilisez le tableau dans son ensemble (comme indiqué ci-dessus). Vous utilisez généralement un élément du tableau. Pour un tableau qui a un nom, si vous souhaitez utiliser le nom du tableau pour obtenir un élément, vous devez taper quelque chose comme $ arr [2] où le nom du tableau (variable) estarr. Quand vous avez une référence au tableau, vous faire la même chose mais avec les accolades comme suit: $ {$ Aref} [2] Voilà vous remplacez, arr avec {} $ Aref.
L'autre moyen d'accéder à un tableau est applicable lorsque vous voulez un élément du tableau (ce qui est ce que vous faites la plupart du temps). Avec cette façon, vous ne commencez pas par le signe scalaire précédent, $. Vous omettez également les accolades. Cependant, vous suivez la variable de référence de tableau, avec une flèche, -> (signe moins suivi par signe supérieur), comme dans l'exemple suivant: $ Aref -> [2] Utilisation de cette façon ne dépend pas de savoir si la référence à un tableau était d'un tableau qui a un nom ou un tableau anonyme.
Lire et essayer le code suivant: use strict; print "Content-Type: text /html \\ n \\ n"; monarr = ("un", "deux", 3, 4); my $ Aref = \\arr; print $ {$ Aref} [1]; Imprimer "my $ arRef = [" un "," deux ", 3, 4]; imprimer $ arRef -> [3]; Hash et de référence envisager la création suivante de hachage: my% ha = (Apple =>« pourpre », Banana => "jaune", Poire => "vert", citron => "vert"); Pour faire une référence à partir de% ha, vous avez à le précéder du \\ signe, comme la déclaration suivante illustre: my $ href = \\% ha; Anonyme Hash Dans la section ci-dessus, vous avez besoin de deux déclarations dans le but de venir avec un hachage La première déclaration donne le tableau un nom,% ha Il est possible d'utiliser une seule instruction à venir avec un.
. ... hachage Dans ce cas, le hachage ne sera pas avoir un nom Il aura juste une référence à la région dans la mémoire qui a le hachage La déclaration suivante illustre ceci: my $ href = {Pomme => "violet", Banana = > «jaune», Poire => "vert", citron => "vert"}; Notons ici que nous avons des accolades pour délimiter les éléments de hachage et les supports ne incurvées pour la liste comme avant Sous cette condition, les accolades retourner une référence (. Adresse de mémoire) à la table de hachage. Cette référence est affecté retourné à la variable scalaire, $ href.
Vous ne devez pas le \\ signe ici, depuis le hachage n'a pas de nom et \\ doit être utilisé en face d'un nom (variable) pour renvoyer une référence. Remarque: Toute variable qui contient une référence est une variable scalaire. Donc, la référence d'un tableau ou de hachage est tenu par une variable scalaire. La référence d'un scalaire est toujours détenu par une variable scalaire. Utilisant un hachage Référence Une façon d'obtenir le hachage d'une référence de hachage (variable contenant la référence) est d'utiliser les accolades.
Pour la référence ci-dessus, vous devez taper,% {$ Aref} Vous commencez avec le signe de hachage,%, car nous avons affaire à une table de hachage. Ceci est suivi par des entretoises. Entre les accolades, vous avez la variable qui contient la référence. Vous n'êtes généralement pas utiliser le hachage dans son ensemble. Vous utilisez généralement une valeur de la table de hachage. Pour un hachage qui a un nom, si vous souhaitez utiliser le nom de hachage pour obtenir une valeur, vous devez taper quelque chose comme $ ha {«clé»} où le nom de la table de hachage (variable) est $ ha.
Lorsque vous avez une référence à la table de hachage, vous faire la même chose mais avec les accolades comme suit: $ {$ href} {«clé»} Voilà vous remplacez, ha avec {$ href}. L'autre moyen d'accéder à une table de hachage est applicable lorsque vous souhaitez un élément du hachage (ce qui est ce que vous faites la plupart du temps). Avec cette façon, vous ne commencez pas par le signe scalaire précédent, $. Vous omettez également les accolades.
Cependant, vous suivez la variable de référence de tableau, avec une flèche, ->, comme dans l'exemple suivant: $ href -> {'clé'} L'utilisation de ce moyen ne dépend pas de savoir si la référence de hachage était d'un hachage qui a un nom ou un hachage anonyme. Lire et essayer le code suivant: use strict; print "Content-Type: text /html \\ n \\ n"; mon% ha = (Apple => "violet", Banana => "jaune", Poire => "vert", citron => "vert"); my $ href = \\% ha; print $ {} {$ href 'Apple'}; print "my $ haRef = {Pomme =>" violet ", Banana =>" jaune ", Poire =>" vert ", citron =>" vert "}; imprimer haRef $ -> {'Banana'}; argument passé par Référence à un sous-programme Lire et essayez le code suivant: use strict; print "Content-Type: text /html \\ n \\ n"; mon% ha = (Apple => "violet", Banana => "jaune"); sous mySub {print $ _ [0], "", $ _ [1], "", $ _ [2], "", $ _ [3], "", $ _ [4], "", $ _ [5], "";} mySub («un», «deux»,% ha); Dans l'appel de fonction, le premier argument est "un", le second argument est «deux» et le troisième argument est% ha.
Dès que la définition de fonction commence l'exécution, "un" devient la première valeur de_; «deux» devient le deuxième argument de_ Ensuite, les éléments de la table de hachage sont aplatis dans le reste des valeurs de_:. Dans mon ordinateur, Apple devient la cinquième valeur de_ et ce ne est pas une bonne idée puisque Apple est en fait une clé de hachage. violet devient la sixième valeur de_ dans mon ordinateur. Banana devient la troisième valeur de_ dans mon ordinateur . Dans mon ordinateur, jaune devient la quatrième valeur de_.
Notez que l'argument de hachage (% ha) dans la fonction appelante est pas une référence. Cela donne lieu à deux problèmes. Les éléments de la table de hachage sont aplatis dans le tableau_. En outre, les éléments de hachage dans le tableau_ ne sont pas dans l'ordre, ils ont été tapés dans la création de la table de hachage. Un problème similaire se produit avec le tableau. Pour résoudre ce problème, qui est de maintenir la structure d'un hachage ou d'un tableau lorsqu'il est passé à une fonction, vous devez passer le hachage ou d'un tableau par référence.
Le code suivant illustre cette situation. use strict; print "Content-Type: text /html \\ n \\ n"; mon% ha = (Apple => "violet", Banana => "jaune"); mySub sub {print $ _ [0], "", $ _ [1], "", $ _ [2] -> {'Apple'}, "", $ _ [2] -> {'Banana'} ; } MySub ("un", "deux", \\% ha); Le troisième argument de l'appel de fonction est une référence à la table de hachage. Ceci a été réalisé en faisant précéder le nom de la variable de hachage avec \\ dans les parenthèses des arguments. Dans l'exécution de la définition de la fonction, il ya seulement trois valeurs pour le tableau_ maintenant.
La première valeur pour le tableau est le premier argument de l'appel de fonction; ça va. La deuxième valeur du tableau est le deuxième argument de l'appel de fonction; ça va. Maintenant, la troisième valeur du tableau est une référence à la table de hachage; qui est accepté. De cette référence, vous pouvez obtenir toutes les valeurs de la table de hachage. Notez comment les deux valeurs de hachage ont été obtenu dans la définition de la fonction ci-dessus.
Lorsque vous passez un tableau ou un hachage comme argument habituellement à une fonction, vous vous retrouvez avec deux copies des éléments dans le tableau ou de hachage: une copie des articles reste dans la variable de tableau ou de hachage. L'autre copie des articles sont dans le tableau_, lorsque la fonction est appelée. Dans le code ci-dessus, la structure de la table de hachage a été maintenue et que vous avez une seule copie des éléments de hachage, qui sont ceux de la table de hachage (défini) créé. Le hachage original avec sa structure est bien sûr maintenue.
Si vous avez attribué la référence de hachage à une variable (scalaire), vous pouvez toujours utiliser la variable (qui détient la référence) comme argument dans l'appel de fonction. Le code suivant illustre cela: use strict; print "Content-Type: text /html \\ n \\ n"; mon% ha = (Apple => "violet", Banana => "jaune"); my $ href = \\% ha; mySub sub {print $ _ [0], "", $ _ [1], "", $ _ [2] -> {'Apple'}, "", $ _ [2] ->