Perl: desreferenciar problemas relacionados con el anidamiento de matrices anónimas

Artículos relacionados

Perl: expresiones regulares

Perl: ¿Cuáles son sus peculiares propiedades de autovivafacción?


Cuando el autor estaba aprendiendo el lenguaje Perl, descubrió que hay muchas formas de desreferenciar arreglos anónimos, y este artículo las resumirá.

En primer lugar, sabemos que hay dos formas de desreferenciar una referencia de matriz (puntero) en perl. Una es usar directamente la variable de referencia (con el prefijo $) como el nombre de la matriz. Este método puede desreferenciar la matriz original como un todo. (usando @dereference), también puede obtener los miembros originales de la matriz (use $dereference y especifique el índice), como se muestra en el siguiente ejemplo, se hace referencia y se elimina la referencia de la matriz.

Ejemplo 1:

    @array=(a,b,c);
    $aref=\@array;   #create reference
    @{$aref}=(A,B,C);  #dereference
    ${$aref}[0]=a;        #dereference
    print @array;    #array=(a,B,C);

Otra forma es usar -> valor de índice entre paréntesis (corchetes, para matrices, use []; para hashes, use {}). Desreferencia, de esta manera solo se puede usar para matrices o hashes (hash) Al final, solo se pueden obtener los miembros originales de la matriz (para un hash, se refiere al valor correspondiente a la clave especificada). Como se muestra en el siguiente ejemplo, se hace referencia y se elimina la referencia de la matriz.

Ejemplo 2:

    @array=(a,b,c);
    $aref=\@array;   #create reference
    $aref->[0]=A;        #dereference
    print @array;    #array=(A,b,c);

Con el conocimiento preliminar anterior, veamos el código perl en el Ejemplo 3, que cubre una variedad de métodos de desreferenciación Más adelante, este artículo explicará todos los métodos de desreferenciación.

Ejemplo 3:

    $line=[['1','2','3'],['4','5','6']];  
    
    print ${$line->[0]}[0],"\n";
    print ${$line}[0]->[0],"\n";
    print $line->[0]->[0],"\n";
    print ${${$line}[0]}[0],"\n";
    print $line->[0][0],"\n";
    
    print @{$line->[0]},"\n";
    print @{${$line}[0]},"\n";

La salida es:

1
1
1
1
1
123
123

Podemos ver que $line es una referencia a una matriz anónima, y ​​esta matriz anónima anida dos matrices anónimas, lo que significa que los elementos de la matriz son dos referencias a las dos matrices anónimas. El propósito de las primeras cinco líneas de código de salida es generar el elemento 1, y tenemos cinco formas de lograrlo.

La primera forma ${$line->[0]}[0]; primero use el segundo método de desreferenciación, $line->[0] significa obtener el primer elemento de la matriz al que apunta de acuerdo con $line, es decir , apunte a la referencia A anónima a la matriz ['1','2','3']. Luego use el primer método de desreferenciación para usar $ e indexar [0] para obtener el primer elemento de la matriz anónima ['1', '2', '3'], que es 1; nota: las llaves {} no se pueden omitir aquí _

El segundo método ${$line}[0]->[0]; primero use el primer método de desreferenciación, ${$line}[0] usa $ e index [0] para obtener una matriz anónima [['1' , '2','3'], el primer elemento de ['4','5','6']], es decir, una referencia a la matriz anónima ['1','2','3'] . Luego use el segundo método de desreferenciación, ${$line}[0]->[0], para obtener la referencia de ${$line}[0] correspondiente al primer elemento de la matriz, que es 1; nota: el grande aquí Los corchetes {} se pueden omitir.

La tercera forma $línea->[0]->[0]; primero use el segundo método de desreferenciación, $línea->[0] se refiere a obtener el primer elemento de la matriz al que apunta de acuerdo con $línea, es decir, apunte a la matriz anónima Una referencia a ['1','2','3']. Luego continúe usando el segundo método de desreferenciación para obtener el primer elemento de la matriz anónima ['1', '2', '3'], que es 1;

La cuarta forma ${${$line}[0]}[0]; primero use el primer método de desreferenciación, ${$line}[0] usa $ e index [0] para obtener una matriz anónima [['1 The primer elemento de ','2','3'],['4','5','6']], que es una referencia a la matriz anónima ['1','2','3'] . Luego continúe usando el primer método de desreferencia para usar $ e indexar [0] para obtener el primer elemento de la matriz anónima ['1', '2', '3'], que es 1; nota: el {} interno aquí puede ser Omitir, la capa exterior {} no se puede omitir.

El quinto método $línea->[0][0]; es una forma simplificada del tercer método, es decir, si hay varios -> anidados, el segundo y posteriores -> se pueden omitir.

Los dos últimos métodos se utilizan para lograr la matriz anónima de salida [1,2,3].

@{$line->[0]}; Primero use el segundo método de desreferenciación, $line->[0] significa obtener el primer elemento de la matriz a la que apunta de acuerdo con $line, que apunta a la matriz anónima [' 1',' 2','3']. Luego use el primer método de desreferenciación, usando @dereference para toda la matriz anónima. Nota: {} aquí no se puede omitir.

@{${$line}[0]}; primero use el primer método de desreferenciación, ${$line}[0] usa $ e index [0] para obtener una matriz anónima [['1','2' ,' 3'], el primer elemento de ['4','5','6']] es una referencia a la matriz anónima ['1','2','3']. Luego continúe usando el primer método de desreferenciación usando @dereferenciación como toda la matriz anónima. Nota: El {} interno aquí se puede omitir, pero el {} externo no se puede omitir.

Presumiblemente, al ver esto, ya sabe cuándo se puede omitir {} en el primer método, es decir, se puede omitir cuando se elimina la referencia como una variable simple, y no se puede omitir cuando es el valor de otros miembros de la matriz o hashes. .

Supongo que te gusta

Origin blog.csdn.net/weixin_45791458/article/details/128968082
Recomendado
Clasificación