2016-05-05 11 views
2

Ich habe paar Stunden damit verbracht, den Wert von 'Auth-Token' aus REST API Antwort Header zu bekommen, ich verstehe einfach nicht die Bedeutung von bless ({key => value}) ist dies ein Hashref in einem Array? Wie kann ich es durchlaufen?Perl erhalten Wert von verschachteltem Hash

$VAR1 = bless({ 
        'access-control-allow-credentials' => 'true', 
        'connection' => 'keep-alive', 
        'x-powered-by' => 'restheart.org', 
        'client-response-num' => 1, 
        'access-control-allow-origin' => '*', 
        'date' => 'Thu, 05 May 2016 22:54:44 GMT', 
        'client-peer' => '172.18.18.122:8080', 
        'content-length' => '469', 
        'access-control-expose-headers' => 'Location, ETag, Auth-Token, Auth-Token-Valid-Until, Auth-Token-Location, X-Powered-By', 
        '::std_case' => { 
             'access-control-allow-credentials' => 'Access-Control-Allow-Credentials', 
             'x-powered-by' => 'X-Powered-By', 
             'client-response-num' => 'Client-Response-Num', 
             'access-control-allow-origin' => 'Access-Control-Allow-Origin', 
             'client-peer' => 'Client-Peer', 
             'access-control-expose-headers' => 'Access-Control-Expose-Headers', 
             'client-date' => 'Client-Date', 
             'auth-token-valid-until' => 'Auth-Token-Valid-Until', 
             'auth-token-location' => 'Auth-Token-Location', 
             'auth-token' => 'Auth-Token' 
            }, 
        'client-date' => 'Thu, 05 May 2016 22:55:00 GMT', 
        'content-type' => 'application/hal+json', 
        'auth-token-valid-until' => '2016-05-05T23:09:44.471Z', 
        'auth-token-location' => '/_authtokens/test', 
        'auth-token' => 'fbbb0215-cedd-4a10-9f89-93fdf1e84fdc' 
        }, 'HTTP::Headers'); 
+1

'$ VAR1 -> {'auth-token'}' –

Antwort

4

Das ist ein Hash, der in ein Objekt HTTP::Headers gesegnet worden ist. Sie können, was Sie mithilfe seiner API benötigen Zugriff:

my $token = $VAR1->header('auth-token'); 

Ich würde es über den Hash nicht empfehlen (Bruch Verkapselung) direkt zugreifen, falls die Interna von HTTP::Headers jemals ändert.

0

Es ist in Perl5 üblich, einen Hash für Objekte zu verwenden. In diesem Fall haben Sie ein 'HTTP :: Headers' Objekt in $ VAR1. Unter der Haube ist das Objekt ein gesegneter HashRef, also was du siehst, sind die gewöhnlichen "Eingeweide" eines Hashes. Links von den "dicken Kommas" sind die Tasten und rechts die Werte.

Also läuft Ihre Frage auf - gegeben ein Hashref in einer Variablen, wie bekomme ich den Wert für Schlüssel 'x'? Nun, hier ist, wie Sie das tun - aber tun Sie es nicht.

print $VAR1->{ auth-token }; 

Der Grund, warum ich sage, „dont do it“ ist, dass Sie ein grundlegendes Prinzip der OO-Programmierung genannt Verkapselung sind zu brechen. Die Details des Objekts sollen Ihnen nichts anhaben. Verwenden Sie stattdessen die von der Klasse bereitgestellten Methoden (dh vom Modul HTTP::Headers bereitgestellt)

Lesen der HTTP::Heders doco, können Sie die Kopfzeile für 'Auth-Token' wie folgt erhalten;

print $VAR1->header('auth-token') 

Dies ist, was Sie tun müssen.

+0

Ich bin mir nicht sicher "einen Hash für Objekte verwenden" ist der richtige Weg, es zu sagen. Grundsätzlich ist ein verschachtelter Hash eine Referenzkette, ebenso ein Objekt. Sie sind also im Wesentlichen die gleiche Sache, es ist nur ein Objekt hat Methoden, die es von einer Klasse bekommt. – Sobrique