2010-08-24 24 views
6

En una pregunta anterior, pregunté cómo inicializar un hash Perl usando slices. Se realiza así:¿Cómo usaría una porción hash para inicializar un hash almacenado en una estructura de datos?

my %hash =(); 
my @fields = ('currency_symbol', 'currency_name'); 
my @array = ('BRL','Real'); 
@hash{@fields} = @array; 

Ahora imaginemos un hash más complejo, y aquí es cómo se inicializa:

my %hash =(); 
my $iso = 'BR'; 
$hash->{$iso}->{currency_symbol} = 'BRL'; 
$hash->{$iso}->{currency_name} = 'Real'; 
print Dumper($hash); 

Esto se traduce en lo siguiente:

$VAR1 = { 
      'BR' => { 
        'currency_symbol' => 'BRL', 
        'currency_name' => 'Real' 
        } 
     }; 

Ahora la pregunta sería: ¿cómo inicializar este hash particular utilizando el método de empalme?

+0

Te golpeado hasta . No tengo idea de por qué alguien te derribó sin una explicación, diablos, tu código está * formateado *. – Axeman

+0

Gracias. Ni siquiera me di cuenta. Estoy empezando a amar este sitio. – emx

Respuesta

3

El perllol documentation's Slices section cubre rebanadas de matriz:

Si usted desea conseguir en una rebanada (parte de una fila) en una matriz multidimensional, vas a tener que hacer algunos subíndices de fantasía. Esto se debe a que si bien tenemos un buen sinónimo de elementos individuales a través de la flecha del puntero para desreferenciar, no existe tal conveniencia para los sectores. (Recuerde, por supuesto, que siempre puede escribir un bucle para hacer una operación de división).

A continuación, se explica cómo realizar una operación mediante un bucle. Asumiremos una variable @AoA como antes.

@part =(); 
$x = 4; 
for ($y = 7; $y < 13; $y++) { 
    push @part, $AoA[$x][$y]; 
} 

Ese mismo bucle podría ser reemplazada por una operación de troceado:

@part = @{ $AoA[4] } [ 7..12 ]; 

Extrapolando para discutir a rodajas, obtenemos

@{ $hash{$iso} }{@fields} = @array; 

Usted sabe que es una rebanada de hash debido a que el “ los subíndices "están rodeados de llaves en lugar de corchetes".

+0

¡Gracias, esto funciona! Estupendo. – emx

+0

@emx ¡De nada! Me alegro de que ayude. –

2

En primer lugar, ya que su hash está declarado %hash, sería simplemente $hash{ $iso }. $hash->{ $iso } se refiere a una ranura en el hash apuntada por $hash, que puede o no estar apuntando a %hash.

Pero una vez que tienes eso, puedes hacer lo siguiente:

@{ $hash{ $iso } }{ @fields } = qw<BRL Real>; 

Pero a medida que los niveles de pronto se complican, es mejor renunciar al lujo autovivification y hacer lo siguiente:

my $h = $hash{ $iso }{blah}{blah} = {}; 
@$h{ @field_names } = @field_values; 

reubicable los punteros dentro de la jerarquía de hashes hacen que sea más fácil escribir accesos anónimos que también permiten cortes sencillos.

+0

Gracias por la aclaración. – emx

1

$hash{$iso} va a ser una referencia hash.Reemplaza lo que sería el nombre de la variable (sin sigilo) en una rebanada simple con un bloque que contiene la referencia, así:

@array{@list} 

convierte

@{ $hash{$iso} }{@list} 

Ver http://perlmonks.org/?node=References+quick+reference

+0

Sí, debería haber intentado eso de hecho. Gracias por el puntero. – emx

Cuestiones relacionadas