2009-08-20 13 views
1

私はNet::OAuthモジュールをYammer APIで承認しようとしています。次のコードスニペットを用意しています。Perl Net :: OAuthの問題

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

しかし、私は試してみて、私のテストを実行する場合、以下のように、それはエラーがスローされます。

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

は、私は明白な構文エラーをしたか、私はOAuthのモジュール自体を見ているつもりですがありますか?

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 = @_; 

答えて

4

$q->Varsはスカラーコンテキストでハッシュリファレンス、リスト内の平坦化ハッシュを返す返すことを確認することができますコンテキスト。サブルーチン引数はリストコンテキストを作成します。したがって、あなたはする必要があります:

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, 
); 

私はこれをチェックするコメントのためにアダムベレアに感謝します。

+0

私はこれも最初に考えましたが、正しくはありません。 cchenesonによってリンクされているソースを見てください。最初の引数だけがハッシュリファレンスになると予想され、残りは@から別のハッシュに引かれます。 –

+0

さらに、それはハッシュコンストラクタの要素数が奇数です;) –

+0

$ q-> Varsがリストコンテキストで平らになったハッシュを返すため、要素数が奇数ではありません。しかし、それが解決策の鍵でした。私の編集された答えを見てください。 –

2

たぶん、あなたは$ Q->バールはハッシュリファレンス

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