/ / La matriz de Perl se inicializó incorrectamente - matrices, perl

Arreglo Perl inicializado incorrectamente - arrays, perl

Comenzando con Perl, y usé el par de paréntesis equivocado para este ejemplo de código:

@arr = {"a", "b", "c"};
print "$_n" foreach @arr;

Quiero decir, por supuesto, puedo ver QUÉ hace cuando lo ejecuto, pero no entiendo POR QUÉ lo hace. ¿No debería fallar simplemente con un error de sintaxis?

Respuestas

3 para la respuesta № 1

Usted ha creado accidentalmente un hash anónimo, que es un hash que no tiene identificador y se accede solo por referencia.

La matriz @arr se establece en un solo elemento que es una referencia a ese hash. Escrito adecuadamente se vería así

use strict;
use warnings;

my @arr = (
{
a => "b",
c => undef,
}
);

print "$_n" foreach @arr;

Es por eso que tienes la salida

HASH(0x3fd36c)

(o algo similar) porque así es como Perl representará una referencia de hash como una cadena.

Si desea experimentar, puede imprimir el valor del primer elemento hash usando $arr[0] como referencia hash (la matriz solo tiene un elemento en el índice cero) y acceder al valor del elemento con la clave a con print $arr[0]->{a}, "n".

Tenga en cuenta que, dado que los hashes deben tener un múltiplo de dos valores (un conjunto de pares clave / valor), el hash en su propio código se amplía implícitamente a cuatro valores al agregar un undef hasta el final.

Es vital que agregas use strict y use warnings a la parte superior de cada programa Perl que escribes. En este caso este último habría planteado la advertencia.

Odd number of elements in anonymous hash

3 para la respuesta № 2

Puede ser sorprendente cómo pocas cosas son errores de sintaxis en Perl. En este caso, ha tropezado con la sintaxis para crear una referencia de hash anónima: { LIST }. Perl no requiere el uso de paréntesis (el () tipo) al inicializar una matriz1. Las matrices contienen listas ordenadas de valores escalares (únicos) y las referencias son escalares, por lo que perl felizmente inicializa su matriz con esa referencia como el único elemento.

No es lo que tu querido, pero es perfectamente válido Perl.

los () anula la prioridad de los operadores y, por lo tanto, cambia el comportamiento de la expresión. @a = (1, 2, 3) hace lo que esperas, pero @a = 1, 2, 3 medio (@a = 1), 2, 3, por lo que solo se asigna 1 a @a.


2 para la respuesta № 3

{ LIST } es el constructor hash. Crea un hash, asigna el resultado de LIST a ella, y le devuelve una referencia.

my $h = {"a", "b", "c", "d"};
say $h->{a};  # b

Una lista de una referencia hash es tan legítima como cualquier otra lista, así que no, no debería ser un error de sintaxis.