2010-02-17 18 views
6

Sto ancora cercando di risolvere il mio hash dereferencing. Il mio attuale problema è che ora sto passando un hashref a un sottotitolo e voglio dereferenziarlo all'interno di quel sottotitolo. Ma non sto trovando il metodo/sintassi corretto per farlo. All'interno del sottotitolo, voglio ripetere le chiavi di hash, ma la sintassi per un hashref non è la stessa cosa di un hash, che so come fare.Come si può trasferire un riferimento di hash Perl che è stato passato a una subroutine?

Quindi quello che voglio è quello di fare questo:

sub foo { 
    %parms = @_; 
    foreach $keys (key %parms) { # do something }; 
} 

ma con un rifhash essere passato in al posto di un hash.

Eventuali puntatori (gioco di parole non previsto) sono i benvenuti.

Grazie.

risposta

3

havn't effettivamente testati il ​​codice in questo momento, ma la scrittura a mano libera si vorrà fare qualcosa di simile:

sub foo { 
    $parms = shift; 
    foreach my $key (keys %$parms) { # do something }; 
} 
+0

Utilizzare lo spostamento anziché @_ ha fatto il trucco e, naturalmente, utilizzando uno scalare anziché un hash per la variabile. Codice di lavoro: sub foo { $ parms = shift; foreach $ key (keys% $ parms) {print "$ key: $$ parms {$ key} \ n"; } } Grazie! – sgsax

+4

'$ parms -> {$ key}' è probabilmente un po 'preferito da '$$ parms {$ key}' – toolic

+1

'shift' vs.' @ _' non è rilevante. 'my ($ hashref) = @_;' funzionerà altrettanto bene. –

2

Ecco un modo per risolvere il riferimento Rif un hash passato a un sub:

use warnings; 
use strict; 

my %pars = (a=>1, b=>2); 
foo(\%pars); 
sub foo { 
    my ($href) = @_; 
    foreach my $keys (keys %{$href}) { print "$keys\n" } 
} 

__END__ 
a 
b 

Vedi anche References quick reference e perlreftut

+1

Grazie per i collegamenti. Ho guardato la pagina perlreftut, tra gli altri, ma sto ancora cercando di capire tutto. – sgsax

2

sub foo 
{ 
    my $params = $_[0]; 
    my %hash = %$params; 
     foreach $keys (keys %hash) 
     { 
     print $keys; 
     } 
} 

my $hash_ref = {name => 'Becky', age => 23}; 

foo($hash_ref); 

anche una buona introduzione sui riferimenti è here.

+0

Grazie per il link. Ho usato quello come riferimento, ma ancora non ne ho ancora pienamente compreso. – sgsax

1
#!/usr/bin/perl 
use strict; 

my %params = (
    date => '2010-02-17', 
    time => '1610', 
); 

foo(\%params); 

sub foo { 
    my ($params) = @_; 
    foreach my $key (keys %$params) { 
     # Do something 
     print "KEY: $key VALUE: $params{$key}\n"; 
    }; 
} 
+0

Eep, non ho visto risposta alle attrezzature fino ad ora. ; x –

+0

Direi che la sua denominazione è migliore (nominando l'hashref come href). –

Problemi correlati