O básico de ActivePerl - Parte 18 Introdução Esta é parte de minha série 18, Noções básicas de ActivePerl. Uma região na memória é um conjunto de células de memória consecutivos. Valores (conteúdo de variáveis) são mantidas em regiões de memória. Uma variável identifica uma região de memória. Uma referência é um ponteiro para uma região de memória e geralmente é usado quando você está mais interessado no que está em uma região de memória e não a variável. Considere-se uma referência, tal como o endereço de uma região de memória. Esta região de memória pode ter um valor.
Nesta parte da série, nós olhamos Referência ActivePerl. Tudo descrito neste tutorial é aplicável a Perl tradicional. Nota: Se você não pode ver o código ou se você acha que alguma coisa está faltando (link quebrado, imagem ausente), apenas contacte-me em [email protected]. Ou seja, contacte-me para o menor problema que você tem sobre o que você está lendo. Região de memória uma região de memória é uma área na memória do computador que armazena o valor de uma variável. Por valor aqui, eu estou me referindo a um valor escalar, array ou hash.
Diferentes regiões de memória com diferentes variáveis Considere o seguinte duas declarações consecutivas: my $ myVar =; "Eu sou o conteúdo de um arquivo de texto grande do disco rígido, agora na memória." my $ Avar = "Eu sou o conteúdo de um arquivo de texto grande do disco rígido, agora na memória."; Você tem duas variáveis diferentes com nomes diferentes, mas com os mesmos valores de cadeia. Uma variável identifica uma região de memória. Duas variáveis diferentes com dois nomes diferentes identificar duas regiões de memória diferentes, tudo igual.
No caso acima, os dois valores, mesmo que são os mesmos, estão em duas regiões de memória diferentes. Região de memória mesmo para duas variáveis diferentes Em ActivePerl que você pode fazer a mesma região de memória tem duas variáveis diferentes. As duas variáveis diferentes, naturalmente, identificar o mesmo valor. Considere as seguintes duas declarações consecutivas: my $ myVar = "Eu sou o conteúdo de um arquivo de texto grande do disco rígido, agora na memória."; my $ hisVar = \\ $ myVar; Pela primeira declaração que você tem um valor atribuir à variável, $ myVar.
Na segunda instrução, $ myVar é precedida com a \\ sinal antes de ser atribuído a uma nova variável, $ hisVar. \\ É um operador. Na segunda instrução, o operador \\, que precede a primeira variável, faz com que a segunda variável identificar a mesma região de memória (mesmo valor) como primeira variável. Uma coisa importante a notar aqui é que \\ $ myVar refere-se a uma região de memória. Para a segunda instrução, \\ $ myVar, com \\, é uma referência (endereço da região de memória identificado por $ myVar). $ hisVar é uma variável, não uma referência.
Dizemos $ myVar contém um valor (a string), enquanto $ hisVar detém a referência (endereço). Usando uma referência Agora que você tem uma referência, como você pode obter o valor da região de memória que uma variável está se referindo? Em outras palavras, uma variável está segurando a referência de alguma região de memória, como você pode obter o valor dessa região de memória, usando a variável? No caso acima, $ hisVar está segurando a referência da região identificado por $ myVar. Para obter o valor usando $ myVar, não há problema, porque você só tem que usar $ myVar no lugar do valor.
Para obter o valor da variável ($ hisVar), que tem a referência, você tem que usar as chaves {} da seguinte forma: $ {$ hisVar} Aqui, estamos lidando com um escalar, assim que você começar com o sinal escalar. Isto é seguido por um par de cintas. Dentro das chaves, você tem a variável que contém a referência. O código a seguir ilustra isso: use strict; print "Content-Type: text /html \\ n \\ n"; my $ myVar = "Eu sou o conteúdo de um arquivo de texto grande do disco rígido, agora na memória."; my $ hisVar = \\ $ myVar; print $ {$ hisVar}; Isso é que você substituir hisVar com {$ hisVar}.
Escalar e referência A explicação acima é aplicável para escalares. Uma coisa semelhante é aplicável a arrays e hashes. No entanto, com matrizes e guisados, existem duas maneiras de criar uma referência e dois modos de usar a referência. Matriz e Referência Considere o seguinte criação array: minhaarr = ("um", "dois", 3, 4); Para fazer uma referência a partir dearr, você tem que preceder a variável com o \\ sinal, como a seguinte declaração ilustra: my $ Aref = \\arr; Matriz Anonymous Na seção anterior, você precisa de duas declarações, a fim de chegar a uma referência de matriz.
A primeira declaração dá a matriz um nome,arr. Agora, é possível usar apenas uma instrução para chegar a uma matriz. Neste caso, a matriz não terá um nome. Ele terá apenas uma referência para a região da memória que tem a matriz. A declaração a seguir ilustra isso: my $ Aref = ["um", "dois", 3, 4]; Note aqui que temos colchetes para delimitar os elementos da matriz e não colchetes curvas para lista como antes. Sob esta condição, os colchetes retornar uma referência (endereço de memória) para a matriz. Esta referência retornada é atribuída à variável escalar, $ Aref.
Você não precisa o \\ sinal aqui, uma vez que a matriz não tem um nome e \\ deve ser usado na frente de um nome. Nota: Qualquer variável que contém uma referência é uma variável escalar. Assim, a referência de uma matriz ou hash é realizada por uma variável escalar. Usando uma matriz de referência Uma maneira de obter a matriz de uma referência de matriz (variável que contém a referência) é usar as chaves. Para a referência acima, você deverá digitar, @ {$ aref} Você começa com o sinal matriz, @, uma vez que você está lidando com um array. Isto é seguido por cintas.
Dentro das chaves, você tem a variável que contém a referência. Você normalmente não usar a matriz como um todo (como indicado acima). É geralmente utilizar um elemento da matriz. Para uma matriz que tem um nome, se você quiser usar o nome de matriz para obter um elemento, você deve digitar algo como: $ arr [2], onde o nome da matriz (variável) éarr. Quando você tem uma referência para a matriz, você faz uma coisa semelhante, mas com as chaves da seguinte forma: $ {$ aref} [2] Que é que você substituir, arr com {$ aref}.
A outra maneira de acessar uma matriz é aplicável quando você quer um elemento da matriz (isto é o que você faz na maioria das vezes). Com este modo, você não começar com o sinal escalar anterior, $. Você também omitir as chaves. No entanto, você seguir a variável de referência de matriz, com uma seta, -> (sinal de menos seguido por sinal de maior que), como no exemplo a seguir: $ aref -> [2] Usando desta forma não depende de se a matriz de referência foi a partir de uma matriz que tem um nome ou um array anônimo.
Leia e tente o seguinte código: use strict; print "Content-Type: text /html \\ n \\ n"; meuarr = ("um", "dois", 3, 4); my $ Aref = \\arr; print $ {$ aref} [1]; print "my $ arRef = [" um "," dois ", 3, 4]; imprimir $ arRef -> [3]; Hash e Referência Considere o seguinte criação de hash: my% ha = (Apple =>" roxo ", Banana => "amarelo", Pêra => "verde", Limão => "verde"); Para fazer uma referência a partir de% ha, você tem que preceda com a \\ sinal, como a seguinte declaração ilustra: my $ href = \\% ha; Anonymous Hash Na seção anterior, você precisa de duas declarações, a fim de chegar a um hash A primeira declaração dá a matriz um nome,% ha É possível utilizar apenas uma instrução para vir acima com um.
. ... haxixe Neste caso, o hash não terá um nome Ela só vai ter uma referência para a região na memória que tem o hash A declaração a seguir ilustra isso: my $ href = {a Apple => "roxo", Banana = > "amarelo", Pêra => "verde", Limão => "verde"}; Note aqui que temos chaves para delimitar os elementos de hash e suportes não curvas para lista como antes Sob esta condição, as chaves retornar uma referência (. endereço de memória) para o hash. Esta referência retornada é atribuída à variável escalar, $ href.
Você não precisa o \\ sinal aqui, uma vez que o hash não tem um nome e \\ deve ser usado na frente de um nome (variável) para retornar uma referência. Nota: Qualquer variável que contém uma referência é uma variável escalar. Assim, a referência de uma matriz ou hash é realizada por uma variável escalar. A referência de um escalar ainda é realizada por uma variável escalar. Usando um Hash de Referência Uma maneira de obter o hash de uma referência de hash (variável que contém a referência) é usar as chaves.
Para a referência acima, você deverá digitar,% {$ aref} Você começa com o sinal de hash,%, uma vez que estamos lidando com um hash. Isto é seguido por cintas. Dentro das chaves, você tem a variável que contém a referência. Você geralmente não usam o hash como um todo. Você geralmente usa um valor do hash. Para um hash que tem um nome, se você quiser usar o nome de hash para obter um valor, você deve digitar algo como: {$ ha "chave"} onde o nome do hash (variável) é de US $ ha.
Quando você tem uma referência para o hash, você faz uma coisa semelhante, mas com as chaves da seguinte forma: $ {$ href} {'chave'} Isso é que você substituir, ha com {$ href}. A outra maneira de acessar um hash é aplicável quando você quer um elemento a partir do hash (este é o que você faz na maioria das vezes). Com este modo, você não começar com o sinal escalar anterior, $. Você também omitir as chaves.
No entanto, você seguir a variável de referência de matriz, com uma seta, ->, como no exemplo a seguir: $ href -> {'chave'} Usando desta forma não depende de se a referência de hash foi a partir de um hash que tem um nome ou um hash anônimo. Leia e tente o seguinte código: use strict; print "Content-Type: text /html \\ n \\ n"; my% ha = (Apple => "roxo", Banana => "amarelo", Pêra => "verde", Limão => "verde"); my $ href = \\% ha; print $ {$ href} {'Maçã'}; print "my $ haRef = {a Apple =>" roxo ", Banana =>" amarelo ", Pêra =>" verde ", Limão =>" verde "}; imprimir $ haRef -> {'Banana'}; Passe Argumento por A referência a uma sub-rotina de leitura e tente o seguinte código: use strict; imprimir "Content-Type: text /html \\ n \\ n"; minha% ha = (Apple => "roxo", Banana => "amarelo"); sub mySub {print $ _ [0], "", $ _ [1], "", $ _ [2], "", $ _ [3], "", $ _ [4], "", $ _ [5], "";} mySub ("um", "dois",% ha); Na chamada de função, o primeiro argumento é "um", o segundo argumento é "dois" eo terceiro argumento é% ha.
Assim que a definição da função começa a execução, "um" torna-se o primeiro valor de_; "dois" torna-se o segundo argumento do_ Em seguida, os itens do hash são achatadas no resto dos valores de_:. Em meu computador, a Apple torna-se o quinto valor de_ e isso não é uma boa idéia já que a Apple é realmente uma chave hash. roxo torna-se o sexto valor de_ no meu computador. Banana torna-se o terceiro valor de_ no meu computador . Em meu computador, amarelo torna-se o quarto valor de_. Observe que o argumento de hash (% ha) na função de chamada não é uma referência. Isto dá origem a dois problemas.
Os itens do hash são achatada na matriz_. Além disso, os itens de hash no_ matriz não estão na ordem, eles foram digitados na criação do hash. Um problema semelhante ocorre com a matriz. Para resolver este problema, que é o de manter a estrutura de um hash ou matriz quando passado para uma função, você tem que passar o hash ou matriz por referência. O código a seguir ilustra isso.
use strict; print "Content-Type: text /html \\ n \\ n"; my% ha = (Apple => "roxo", Banana => "amarelo"); sub mySub {print $ _ [0], "", $ _ [1], "", $ _ [2] -> {'Maçã'}, "", $ _ [2] -> {'Banana'} ; } MySub ("um", "dois", \\% ha); O terceiro argumento na chamada de função é uma referência para o hash. Isto foi conseguido precedendo o nome da variável hash com \\ nos parênteses dos argumentos. Na execução da definição da função, existem apenas três valores para o array_ agora. O primeiro valor para a matriz é o primeiro argumento na chamada de função; tudo bem.
O segundo valor da matriz é o segundo argumento da chamada de função; tudo bem. Agora, o terceiro valor da matriz é uma referência para o hash; que é aceito. A partir desta referência, você pode obter todos os valores do hash. Note como os dois valores de hash foram obtidos na definição da função acima. Quando você passar um array ou um hash como argumento habitualmente para uma função, você acaba com duas cópias dos itens na matriz ou hash de: uma cópia dos itens permanece na variável de matriz ou hash. A outra cópia dos itens estão na matriz_, quando a função é chamada.
No código acima, a estrutura do hash foi mantida e você tem apenas uma cópia dos itens de hash, que são aqueles do hash criado (definido). O hash original com a sua estrutura é claro, mantida. Se você atribuiu a referência de hash a uma variável (escalar), você ainda pode usar a variável (que detém a referência) como argumento na chamada de função.
O código a seguir ilustra isso: use strict; print "Content-Type: text /html \\ n \\ n"; my% ha = (Apple => "roxo", Banana => "amarelo"); my $ href = \\% ha; sub mySub {print $ _ [0], "", $ _ [1], "", $ _ [2] -> {'Maçã'}, "", $ _ [2] ->