2009-11-24 9 views
5
# I have a hash 
    my %my_hash; 

# I have an array 
    @my_array = ["aa" , "bbb"]; 

# I store the array in my hash 
    $my_hash{"Kunjan"} = @my_array; 

# But I can't print my array's element 
    print $my_hash{"Kunjan"}[0]; 

Sono nuovo di Perl. Mi aiuti per favore.Come accedere all'elemento dell'array memorizzato nel mio hash in Perl?

+5

Nessuno lo ha ancora menzionato, ma controlla il ricettario di Strutture dati. Ha molti esempi per la creazione e l'accesso ai dati in varie strutture nidificate. Puoi leggerlo sul tuo computer usando il comando 'perldoc perldsc' e puoi anche trovarlo su http://perldoc.perl.org/perldsc.html – daotoad

+1

Inoltre, vedi http://perlmonks.org/?node= riferimenti + quick + riferimento – ysth

risposta

3

avete un paio di errori nel vostro programma:

my @my_array = ("aa" , "bbb"); 
$my_hash{"Kunjan"} = \@my_array; 
print $my_hash{"Kunjan"}[0]; 

Ho fatto tre cambi:

  1. Aggiunto my davanti @my_array sulla prima linea
  2. Modificare il [...] a (...) su la prima riga
  3. Aggiungi un \ davanti a @my_array o n la seconda riga
+0

Potrebbe anche aggiungere che il backslash converte l'array in un riferimento. Leggi i riferimenti qui: http://perldoc.perl.org/perlref.html –

14

La sintassi dell'array non è corretta. Stai creando un riferimento elenco anonimo e @my_array è un elenco di elementi singoli contenente tale riferimento.

è possibile lavorare con il riferimento corretto, come uno scalare:

$my_array = ["aa" , "bbb"]; 
$my_hash{"Kunjan"} = $my_array; 

Oppure si può lavorare con la lista come una lista, creando solo il riferimento quando metterlo in l'hash:

@my_array = ("aa" , "bbb"); 
$my_hash{"Kunjan"} = \@my_array; 
0

provare queste modifiche:

my %my_hash; 

# ["aa" , "bbb"] produces an array reference. Use() instead 
my @my_array = ("aa" , "bbb"); 

# 'Kunjan' hash is given reference to @my_array 
$my_hash{ Kunjan } = \@my_array; 

# bareword for hash key is nicer on the eye IMHO 
print $my_hash{ Kunjan }[0]; 


Tuttavia, v'è ancora una cosa che dovete considerare se si utilizza questo metodo:

unshift @my_array, 'AA'; 
print $my_hash{ Kunjan }[0]; # => AA - probably not what u wanted! 


Così che cosa si sono probabilmente dopo è:

$my_hash{ Kunjan } = ["aa" , "bbb"]; 

Poi l'hash non è più fa riferimento @my_array .

/I3az/

10

Se avessi solo mettere questo nella parte superiore dello script:

use strict; 
use warnings; 

... si sarebbe ottenuto alcuni messaggi di errore che indicano che cosa era sbagliato:

Global symbol "@my_array" requires explicit package name at kunjan-array.pl line 8. 
Global symbol "@my_array" requires explicit package name at kunjan-array.pl line 11. 

Così, dichiarare la matrice prima con my @my_array; e poi si otterrebbe:

Can't use string ("1") as an ARRAY ref while "strict refs" in use at kunjan-array.pl line 14. 
  • è stato creato un rifarray e ha tentato di assegnarlo a una matrice - vedi perldoc perldata per come dichiarare un array
  • Si è tentato di assegnare un array ad un hash (è possibile assegnare solo scalari, come ad esempio un rifarray - vedi perldoc perlref per ulteriori informazioni sui riferimenti)
  • È necessario dereferenziare l'elemento hash per ottenere l'elemento dell'array, ad es.$my_hash{"Kunjan"}->[0] - ancora una volta vedere perldoc perlref per come dereference un rifhash
+0

Non c'è bisogno della freccia: '$ my_hash {Kunjan} [0]' funzionerà. – friedo

+0

@friedo: huh, non pensavo che lo zucchero '->' funzionasse prima del primo '->'. pulito. – Ether

0

Altri già spiegato bene come stanno le cose, ma vorrei aggiungere, che (soprattutto se siete nuovi a Perl), sarebbe bello se si spende un po 'di tempo e leggere i documenti perldsc e perllol.