2009-08-20 7 views
1

Ich versuche, das Net::OAuth Modul zu verwenden, um mit der Yammer-API zu autorisieren, und ich habe das folgende Code-Snippet, ziemlich aus der Zusammenfassung auf CPAN genommen.Perl Net :: OAuth Problem

$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A; 
my $q = new CGI; 

my $request = Net::OAuth->request("request token")->from_hash($q->Vars, 
       request_url => $self->_request_token_url, 
       request_method => $q->request_method, 
       consumer_secret => $self->consumer_private, 
      ); 

Aber wenn ich versuche, und meinen Test führen Sie es wirft einen Fehler wie folgt:

Expected a hash! at /Library/Perl/5.8.8/Net/OAuth/Message.pm line 241. 

Habe ich einen offensichtlichen Syntaxfehler gemacht oder bin ich an dem OAuth-Modul selbst suchen gehen zu müssen?

Antwort

4

$q->Vars eine Hash-Referenz in Skalarkontext zurückgibt und eine abgeflachte Hash in der Liste Kontext. Unterroutinenargumente erstellen einen Listenkontext. Daher sollten Sie tun:

my $request = Net::OAuth->request("request token")->from_hash(
     scalar $q->Vars, 
     request_url => $self->_request_token_url, 
     request_method => $q->request_method, 
     consumer_secret => $self->consumer_private, 
); 

Dank Adam Bellaire für den Kommentar, die mich gemacht überprüfen.

+0

Ich dachte das zuerst auch, aber es ist nicht richtig. Sehen Sie sich die Quelle an, die von ccheneson verlinkt wird, nur das erste Argument wird als Hash-Referenz erwartet, der Rest wird von @_ in einen separaten Hash gezogen. –

+0

Außerdem ist das eine ungerade Anzahl von Elementen in einem Hash-Konstruktor;) –

+0

Es ist keine ungerade Anzahl von Elementen, weil $ q-> Vars im Listenkontext einen flacheren Hash zurückgibt. Aber das war der Schlüssel zur Lösung. Siehe meine bearbeitete Antwort. –

2

Im Net::OAuth::Message

sub from_hash { 
    my $proto = shift; 
    my $class = ref $proto || $proto; 
    my $hash = shift; 
    if (ref $hash ne 'HASH') { 
     die 'Expected a hash!'; 
    } 
    my %api_params = @_; 

Vielleicht können Sie sicherstellen, dass $ q-> Vars gibt einen Hash-ref

my $vars = $q->Vars; 
print ref($vars);