hashes perl hash

perl - hashes - Encuentra el nombre de la tecla en hash con solo una tecla?



hash of hashes perl (7)

Si tengo un hash

my %h = ( secret => 1; );

y sé que solo hay una clave en el hash, pero no sé cómo se llama.

¿Tengo que iterar a través de ese hash?

my $key; foreach my $i (keys %h) { $key = $h{$i}; }

¿O hay una mejor manera de obtener el nombre de la clave?


Echemos un vistazo a

my ($key) = %h;

Los hashes y las matrices no son tan diferentes como parecen. Ambos están estrechamente relacionados con las listas. Usar listas es la forma en que se inicializan normalmente, y => es principalmente un alias para , con la única diferencia de que trata implícitamente su operando izquierdo. Perl solo se detiene si olvida la cita de su operando correcto, por lo que se aceptarán las dos líneas siguientes:

my %h = (a=>b=>c=>''d''); my @a = (a=>b=>c=>''d'');

Bueno, ¿alguna vez has intentado esto?

my %h = (''key'');

...o esto:

my @a = (''value''); my %h = @a;

El hash anterior puede parecer un poco extraño, pero solo es una clave con el valor undef .

Como es más probable que pregunte cómo acceder al valor único, le sugiero que use:

my ($key, $value) = %h;

... o incluso más simple:

my ($key) = %h;

Eso es con lo que comenzamos.


No creo que sea necesario usar la función de keys .

my ($key) = %h;

o

my $key = (%h)[0];

El hash dentro de los parens se ampliará a una lista, entonces simplemente podemos tomar el primer elemento de esa lista, que es la clave.


Una porción de lista debería hacerlo

(keys %h)[0]

keys devuelve una lista, así que solo extrae el primer elemento de esa lista.


[ keys %h ]->[0] también hará la desambiguación que Joel menciona en un comentario anterior. Sin embargo, este código huele a causa de problemas. Si realmente hay solo un par clave / valor único, podría haber una mejor manera de manejar los datos.

Por lo menos, verificaría para asegurarse de que la expectativa nunca se viola silenciosamente. P.ej-

keys %h == 1 or die "ETOOMANYKEYS"; print [ keys %h ]->[0], $/;


my $k = each %h;

Sin embargo, debe recordar reiniciar el iterador si alguna vez desea usarlo en el mismo hash nuevamente. O bien each lo hará, o las keys harán, y si se usa en un contexto escalar, evitará crear una lista. Entonces puedes restablecerlo con

scalar keys %h; # OR each %h; # <- gets the undef my $k2 = each %h; # <- gets the first key

Entonces podrías hacerlo así:

my $k = ( scalar keys %h, each %h );

Pero asumiendo que es como leer mensajes JSON y cosas en las que solo quieres leer lo que está en el hash una vez y tirarlo, es probablemente el más breve. Sin embargo, si desea la variable de inmediato, probablemente sea más fácil hacer esto:

my ( $k, $v ) = each %$simple_JSON_structure;


my ($key) = keys %h;

Como usa el contexto de la lista en ambos lados del operador de asignación, el primer elemento de la lista de teclas se asigna a $ key.


my @keys = keys %h; my $key = $keys[0];