2010-05-01 10 views
9

Sono nuovo in Perl e ho un problema molto semplice ma non riesco a trovare la risposta quando consulta il mio libro Perl.Come accedere a un valore di un hash Perl annidato?

Quando si stampa il risultato di

Dumper($request); 

ottengo il seguente risultato:

$VAR1 = bless({ 
      '_protocol' => 'HTTP/1.1', 
      '_content' => '', 
      '_uri' => bless(do{\(my $o = 'http://myawesomeserver.org:8081/counter/')}, 'URI::http'), 
      '_headers' => bless({ 
            'user-agent' => 'Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.4) Gecko/20080528 Epiphany/2.22 Firefox/3.0', 
            'connection' => 'keep-alive', 
            'cache-control' => 'max-age=0', 
            'keep-alive' => '300', 
            'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
            'accept-language' => 'en-us,en;q=0.5', 
            'accept-encoding' => 'gzip,deflate', 
            'host' => 'localhost:8081', 
            'accept-charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7' 
            }, 'HTTP::Headers'), 
      '_method' => 'GET', 
      '_handle' => bless(\*Symbol::GEN0, 'FileHandle') 
      }, 'HTTP::Server::Simple::Dispatched::Request'); 

Come posso accedere ai valori di '_method' ('GET') o di 'host' ('localhost: 8081').

So che è una domanda facile, ma Perl è un po 'criptico all'inizio.

+0

Se non sei sicuro di come utilizzare un oggetto, dovresti leggere la documentazione per l'oggetto che stai usando * prima * di lettura per Data :: Dumper. Per favore ascoltate la risposta di Axeman. – Ether

risposta

12

Narthring ha ragione per quanto riguarda il metodo forza bruta. hash nidificate sono indirizzate concatenando le chiavi in ​​questo modo:

$hash{top_key}{next_key}{another_key}; # for %hash 
# OR 
$hash_ref->{top_key}{next_key}{another_key}; # for refs. 

Tuttavia poiché entrambi questi "hash" sono benedetti oggetti. Potrebbe aiutare a leggere su HTTP::Server::Simple::Dispatched::Request, che può dire che si tratta di un oggetto HTTP::Request e guardando HTTP::Request sezione sui metodi header e method, si dice che il seguente fare il trucco:

my $method = $request->method(); 
my $host = $request->header('host'); 

Davvero, vi consiglio prendi il firefox search plugin called Perldoc Module::Name e quando incontri l'uscita Dumper che dice "benedica ..." Some :: Module :: Name "" puoi semplicemente copiarlo e incollarlo nel plugin di ricerca e leggere la documentazione su CPAN.

+2

+1. Ho spesso desiderato vietare l'uso di Data :: Dumper ai programmatori Perl principianti, in quanto apre ogni oggetto a sguardi indiscreti e diventa più facile raggiungere semplicemente l'oggetto e afferrare il valore desiderato dall'hash anziché * leggendo il documentazione * e utilizzando i metodi appropriati di accesso. Cosa farai quando la rappresentazione del campo cambia nella prossima revisione? È una convenzione di Perl che ** i valori privati ​​iniziano con underscore ** e ** non dovrebbero mai essere accessibili direttamente **. – Ether

+1

Dati :: Dumper è molto utile, ma particolarmente prezioso per i principianti. –

+1

@Pedro Silva: sono d'accordo. È davvero un compromesso. Ho visto alcuni programmatori sbattere contro il muro. * Se solo loro potessero vedere cosa stava restituendo la chiamata DBI *. Il ragazzo che ho mostrato a DD, è stato così grato e ha velocizzato enormemente il suo progetto. È decisamente meglio che sentirsi in una stanza buia. Da quando ho trovato [Smart :: Comments] (http://search.cpan.org/perldoc?Smart::Comments), lo stavo raccomandando agli altri sviluppatori, come un modo quasi impeccabile di essere in grado di vedere cosa sta facendo veramente il tuo codice. Tuttavia, mostrare i difetti di ciò che dovrebbero essere "oggetti" ha anche i suoi svantaggi. – Axeman

Problemi correlati