2010-08-24 17 views
6

In una domanda precedente ho chiesto come inizializzare un hash Perl usando le slice. E 'fatto così:Come utilizzare una slice hash per inizializzare un hash memorizzato in una struttura dati?

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

Ora immaginiamo un hash più complesso, ed ecco come viene inizializzato:

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

Il risultato è il seguente:

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

Ora la domanda sarebbe: come inizializzare questo particolare hash usando il metodo splice?

+0

ti ho urtato up . Non ho idea del motivo per cui qualcuno ti ha urtato senza una spiegazione - diamine, il tuo codice è persino * formattato *. – Axeman

+0

Grazie. Non me ne sono nemmeno accorto. Sto iniziando ad amare questo sito. – emx

risposta

3

Il perllol documentation's Slices section copre fette di matrice:

Se si vuole arrivare a una fetta (parte di una riga) in un array multidimensionale, si sta andando ad avere per fare un po 'di fantasia subscripting. Questo perché mentre abbiamo un sinonimo di singoli elementi tramite la freccia del puntatore per il dereferenziamento, non esiste una tale convenienza per le sezioni. (Ricorda, naturalmente, che puoi sempre scrivere un ciclo per eseguire un'operazione a sezioni.)

Ecco come eseguire un'operazione utilizzando un ciclo. Assumeremo una variabile @AoA come prima.

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

Lo stesso ciclo potrebbe essere sostituito con un'operazione fetta:

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

Estrapolando di hash fette, otteniamo

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

Sai che è una fetta di hash, perché il “ subscripts "sono circondati da parentesi graffe anziché parentesi quadre.

+0

Grazie, funziona! Grande. – emx

+0

@emx Prego! Sono contento che aiuti. –

2

Prima di tutto, poiché il tuo hash è dichiarato %hash, sarebbe solo $hash{ $iso }. $hash->{ $iso } fa riferimento a uno slot nell'hash indicato da $hash, che può essere o meno puntato a %hash.

Ma una volta che si dispone di questo, si può fare quanto segue:

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

Ma i livelli presto diventano complesse, è meglio rinunciare al lusso autovivificazione e procedere come segue:

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

rilocabile i puntatori all'interno della gerarchia degli hash rende più facile scrivere accessi anonimi che consentono anche fette semplici.

+0

Grazie per il chiarimento. – emx

1

$hash{$iso} sta per essere un riferimento hash.Si sostituisce quello che sarebbe il nome della variabile (senza il sigillo) in una semplice fetta con un blocco che contiene il riferimento, in modo da:

@array{@list} 

diventa

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

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

+0

Sì, avrebbe dovuto provarlo. Grazie per il puntatore. – emx

Problemi correlati