elsif else ciclo arrays perl hash perl-data-structures

arrays - else - ¿Cómo obtener hashes de matrices en Perl?



else if perl (6)

La estructura de datos anidados contiene una referencia hash, no un hash.

# Will work (the -> dereferences the reference) $row = $records[$index]; print "This will work: ", $row->{firstName}, "/n"; # This will also work, by promoting the hash reference into a hash %row = %{ $records[$index] }; print "This will work: ", $row{firstName}, "/n";

Si alguna vez se le presenta una estructura de datos profunda de Perl, puede beneficiarse de la impresión con Data :: Dumper para imprimirla en un formato legible por humanos (y por medio de Perl).

Quiero escribir un poco de la función "DBQuery" en perl, así que puedo tener líneas simples que envían una instrucción SQL y recibir de vuelta y una matriz de hashes, es decir, un conjunto de registros. Sin embargo, estoy teniendo un problema con la sintaxis de Perl (y probablemente con algún puntero extraño / problema de referencia) que me impide empaquetar la información del hash que obtengo de la base de datos. El código de ejemplo siguiente muestra el problema.

Puedo obtener los datos "Jim" de un hash dentro de una matriz con esta sintaxis:

print $records[$index]{''firstName''}

devuelve "Jim"

pero si copio primero el registro de hash en la matriz a su propia variable hash, extrañamente ya no puedo acceder a los datos en ese hash:

%row = $records[$index]; $row{''firstName''};

devuelve "" (en blanco)

Aquí está el código de muestra completo que muestra el problema. Cualquier ayuda es apreciada:

my @records = ( {''id'' => 1, ''firstName'' => ''Jim''}, {''id'' => 2, ''firstName'' => ''Joe''} ); my @records2 = (); $numberOfRecords = scalar(@records); print "number of records: " . $numberOfRecords . "/n"; for(my $index=0; $index < $numberOfRecords; $index++) { #works print ''you can print the records like this: '' . $records[$index]{''firstName''} . "/n"; #does NOT work %row = $records[$index]; print ''but not like this: '' . $row{''firstName''} . "/n"; }


La matriz de hashes en realidad no contiene hashes, sino más bien referencias a un hash. Esta línea:

%row = $records[$index];

asigna% fila con una entrada. La clave es el escalar :

{''id'' => 1, ''firstName'' => ''Jim''},

Que es una referencia al hash, mientras que el valor está en blanco.

Lo que realmente quieres hacer es esto:

$row = $records[$index]; $row->{''firstName''};

si no:

$row = %{$records[$index];} $row{''firstName''};


Otros han comentado hashes vs hashrefs. Otra cosa que creo que debería mencionarse es su función DBQuery: ¿parece que está intentando hacer algo que ya está integrado en DBI? Si entiendo tu pregunta correctamente, estás tratando de replicar algo como select_arrayref :

Este método de utilidad combina "preparar", "ejecutar" y "fetchall_arrayref" en una sola llamada. Devuelve una referencia a una matriz que contiene una referencia a una matriz (o hash, ver a continuación) para cada fila de datos obtenidos.


Para agregar a las amables respuestas anteriores, permítanme agregar que siempre, siempre, siempre (sí, tres "siempre" es) utilice "usar advertencias" en la parte superior de su código. Si lo hubiera hecho, habría recibido la advertencia "Referencia encontrada donde se esperaba una lista de tamaño uniforme en -e línea 1".


lo que realmente tienes en tu matriz es un hashref, no un hash. Si no entiende este concepto, probablemente valga la pena leer la documentación de perlref .

para obtener el hash que necesitas hacer

my %hash = %{@records[$index]};

P.ej.

my @records = ( {''id'' => 1, ''firstName'' => ''Jim''}, {''id'' => 2, ''firstName'' => ''Joe''} ); my %hash = %{$records[1]}; print $hash{id}."/n";

A pesar de que. No estoy seguro de por qué querría hacer esto, a menos que sea para fines académicos. De lo contrario, recomendaría fetchall_hashref / fetchall_arrayref en el módulo DBI o algo así como Class :: DBI.


También tenga en cuenta que un buen idioma perl para usar es

for my $rowHR ( @records ) { my %row = %$rowHR; #or whatever... }

para iterar a través de la lista.