2010-05-01 9 views
9

Ich bin neu in Perl und ich habe ein Problem, das sehr einfach ist, aber ich kann die Antwort nicht finden, wenn ich mein Perl-Buch konsultiere.Wie greife ich auf einen Wert eines verschachtelten Perl-Hashs zu?

Beim Drucken des Ergebnisses

Dumper($request); 

ich folgendes Ergebnis:

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

Wie kann ich die Werte von '_method' zugreifen ('GET') oder dem 'Gastgeber' ('localhost: 8081').

Ich weiß, das ist eine einfache Frage, aber Perl ist am Anfang etwas kryptisch.

+0

Wenn Sie nicht sicher sind, wie Sie ein Objekt verwenden, sollten Sie die Dokumentation für das Objekt, das Sie * vor * lesen, für Data :: Dumper lesen. Bitte beachtet Axemans Antwort. – Ether

Antwort

12

Narthring hat es richtig so weit wie die Brute-Force-Methode. Verschachtelte Hashes werden durch Verkettung der Tasten wie so angesprochen:

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

Da jedoch beide „Hashes“ sind gesegnet Objekte. Es könnte helfen, auf HTTP::Server::Simple::Dispatched::Request Lesen auf, was man sagen kann, dass es ein HTTP::Request Objekt ist und Blick auf HTTP::Request Abschnitt über die header und method Methoden, sagt Ihnen, dass die folgende den Trick:

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

Wirklich, empfehle ich Ihnen Holen Sie sich die firefox search plugin called Perldoc Module::Name und wenn Sie auf Dumper-Ausgabe, die sagt "bless ... 'Some :: Module :: Name'" Sie können einfach kopieren und fügen Sie es in das Such-Plugin und lesen Sie die Dokumentation auf CPAN.

+2

+1. Ich habe oft die Verwendung von Data :: Dumper durch Anfänger von Perl-Programmierern verbieten lassen, da es jedes Objekt vor neugierigen Blicken öffnet und es einfacher wird, einfach in das Objekt zu greifen und den gewünschten Wert aus dem Hash zu holen als das * zu lesen Dokumentation * und mit den richtigen Accessor-Methoden. Was werden Sie tun, wenn sich die Felddarstellung in der nächsten Revision ändert? Es ist eine Perl-Konvention, dass ** private Werte mit Unterstrich beginnen ** und ** niemals direkt aufgerufen werden **. – Ether

+1

Data :: Dumper ist sehr nützlich, aber vor allem für Anfänger von unschätzbarem Wert. –

+1

@Pedro Silva: Ich stimme zu. Es ist wirklich ein Kompromiss. Ich habe einige Programmierer gesehen, die gegen die Wand geschleudert haben. * Wenn sie nur sehen könnten, was der DBI-Aufruf zurückgegeben hat *. Der Typ, dem ich DD gezeigt habe, war so dankbar und es hat sein Projekt enorm beschleunigt. Es ist definitiv besser als sich in einem dunklen Raum zu fühlen. Seit ich [Smart :: Comments] (http://search.cpan.org/perldoc?Smart::Comments) gefunden habe, empfehle ich dies anderen Entwicklern als eine nahezu mühelose Möglichkeit, es zu sehen was dein Code wirklich macht. Das Zeigen der Knochen von Objekten, die "Objekte" sein sollen, hat jedoch auch ihre Nachteile. – Axeman

Verwandte Themen