2010-05-01 11 views
9

Soy nuevo en Perl y tengo un problema que es muy simple pero no puedo encontrar la respuesta cuando consulto mi libro de Perl.¿Cómo accedo al valor de un hash Perl anidado?

Al imprimir el resultado de

Dumper($request); 

me sale el siguiente resultado:

$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'); 

¿Cómo puedo acceder a los valores de '_method' ('GET') o de 'anfitrión' ('localhost: 8081').

Sé que es una pregunta fácil, pero Perl es algo críptico al principio.

+0

Si no está seguro de cómo usar un objeto, debe leer la documentación del objeto que está utilizando * antes de * leer para Data :: Dumper. Por favor, escucha la respuesta de Axeman. – Ether

Respuesta

12

Narthring lo tiene hasta método de fuerza bruta método. hashes anidados están dirigidas por el encadenamiento de las teclas, así:

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

Sin embargo, ya que ambos de estos "hash" son benditos objetos. Podría ayudar a leer sobre HTTP::Server::Simple::Dispatched::Request, que le puede decir que es un objeto HTTP::Request y mirando a HTTP::Request sección sobre los métodos header y method, te dice que el siguiente hacer el truco:

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

En realidad, se lo recomiendo obtenga el firefox search plugin called Perldoc Module::Name y cuando se encuentre con la salida de Dumper que diga "bendiga ... 'Algunos :: Módulo :: Nombre'", puede simplemente copiar y pegar en el complemento de búsqueda y leer la documentación en CPAN.

+2

+1. A menudo he querido prohibir el uso de Data :: Dumper por los programadores principiantes de Perl, ya que abre todos los objetos a las miradas indiscretas y es más fácil simplemente alcanzar el objeto y obtener el valor deseado del hash en lugar de * leer el documentación * y utilizando los métodos de acceso adecuados. ¿Qué harás cuando la representación de campo cambie en la próxima revisión? Es una convención de Perl que ** los valores privados comienzan con guiones bajos ** y ** nunca se debe acceder directamente **. – Ether

+1

Data :: Dumper es muy útil, pero particularmente invaluable para los principiantes. –

+1

@Pedro Silva: Estoy de acuerdo. Realmente es una compensación. He visto algunos codificadores chocar contra la pared. * Si solo pudieran ver lo que devolvía la llamada DBI *. El tipo al que le enseñé DD estaba muy agradecido y aceleró enormemente su proyecto. Definitivamente es mejor que sentirse en una habitación oscura. Desde que encontré [Smart :: Comments] (http://search.cpan.org/perldoc?Smart::Comments), he estado recomendando eso a otros desarrolladores, como una forma fácil de verlo. lo que tu código realmente está haciendo Sin embargo, mostrar los huesos de lo que se supone que son "objetos" también tiene sus inconvenientes. – Axeman

Cuestiones relacionadas