2011-12-26 7 views
0

私はかなり些細なことであるはずのPerl 5.8.8でハッシュリファレンスを渡そうとしています。私はすべての私のコード内の場所にハッシュを渡すが、いくつかの理由では、このサブルーチンでは動作しません:Perlでハッシュリファレンスを渡す

sub build_results_hash { 
    my %results; 
    my $search = $_[0]; 
    my $json = $_[1]; 
    my $json_passed = $_[2]; 

    my $dbh = db_connect(-db=>'ghgs'); 

    my $db_search = html_db_input($search,$dbh); 
    %results = db_hoh(-query=>"SELECT listing_id,MATCH(search) AGAINST($db_search) as relevance FROM search WHERE MATCH(search) AGAINST($db_search) LIMIT 1000",-key=>"listing_id",-dbh=>$dbh); 

    if(($json_passed == 1) and ($json ne '[]')) 
    { 
     narrow_results_hash(\%results,$search,$dbh,$json); 
    } 

    db_x($dbh); 

    return \%results; 
} 

sub db_hoh { 
    # ... 
    return %hoh; 
} 

db_hohちょうどハッシュのハッシュを返します。問題は私がnarrow_results_hashに電話し、%resultsを渡したときです。それは動作しません。しかし、そのメソッド呼び出しを囲んでいるifステートメントを削除すると、ハッシュは正常に渡されます!私はその行動を引き起こす原因がわからない。それは印刷し、私はbuild_results_hashnarrow_results_hash呼び出しの周りif文を削除した場合

sub narrow_results_hash 
{ 
    use JSON::XS; 
    my $params = shift; 
    my %results = %$params; 
    # ... 
    print join(',',keys %results), "\n"; 
    # ... 
} 

:ここでは、私はハッシュを受信する方法である「107,99,34」。ただし、呼び出しの周りにifステートメントが存在する場合は、 "HASH(0x7fd61fbf0580)"と表示されます。

+1

「うまくいかない」(http://catb.org/~esr/faqs/smart-questions.html#beprecise)とはどういう意味ですか?また、サンプルコードを[最小限のテストケース](http://sscce.org/)に減らしてください。それは単なるものではありません。 – outis

+2

Re: "私は自分のコード内でハッシュを渡します"、ハッシュをサブスカート(スカラーのリスト)に渡すことはできません。サブシステムはハッシュ(スカラーのリストのみ)を返すことはできません。 – ikegami

+0

'%results'を見て、それがあなたが信じているようにハッシュのハッシュであることを確認するには、[Data :: Dumper](http://search.cpan.org/~smueller/Data-Dumper-2.131/Dumper.pm)を使用してください。 db_hohメソッドを検索しようとしましたが、DBIのマニュアルで見つけることができませんでした。私は 'db_hoh'がおそらく***参照***をハッシュのハッシュに戻していると思われます。 –

答えて

1

db_hohはおそらくハッシュではなくハッシュリファレンスを返します。結果変数としてスカラーを使用してみてください。

my %results; 

は、私がコメントのためにあまりにも多くのコメントを持っているように...

2

my $results; 

になります。

あなたの実際の質問には、あなたを助けるためにいくつかのことを知る必要があります。

  1. db_hohが返すのは、ハッシュへの参照、またはキーと値のペアのリストです。
  2. 「うまくいかない」とはどういう意味ですか?まったく動かないのですか?何らかの操作が完了しても、予期しない結果が出ますか?

さらに、私はあなたのコードにいくつかの文章的なコメントがあります。あなたはCの世界から来ているように見えますが、そうですか? $jsonが定義されている場合、リストの割り当てはクリーナーそれは

  • 私は誤解しない限り、あなたは$json_passedを使用する必要はありませんが、むしろ、あなたがテストすることができますが移入されるまで待つことができ%resultsを宣言
  • を探しているよう@_の開梱

    1. narrowサブで
    2. 、あなたは$params

    彼の作成を回避することができますhtml_db_inputは、あなたがSQL injection攻撃に開いた自分を残している$db_searchに格納された入力を掃除されていない限り、最も重要なのは、おそらく最後に

    sub build_results_hash { 
        my ($search, $json) = @_; 
    
        my $dbh = db_connect(-db=>'ghgs'); 
    
        my $db_search = html_db_input($search,$dbh); 
        my %results = db_hoh(
         -query=>"SELECT listing_id,MATCH(search) AGAINST($db_search) as relevance FROM search WHERE MATCH(search) AGAINST($db_search) LIMIT 1000", 
         -key=>"listing_id", 
         -dbh=>$dbh 
        ); 
    
        if((defined $json) and ($json ne '[]')) 
        { 
         narrow_results_hash(\%results,$search,$dbh,$json); 
        } 
    
        db_x($dbh); 
    
        return \%results; 
    } 
    
    sub narrow_results_hash 
    { 
        use JSON::XS; #unless you expect this import to be local it looks funny here 
        my %results = %{ shift() }; 
        # ... 
    } 
    

    、および:再更新されたコードです。あなたがあなた自身のDBアクセスライブラリを持っているかのように見えますが、あなたは私のような何かをするだろうDBIを使用していた場合:

    my $dbh = ...; # connect to db 
    my $sth = $dbh->prepare('SELECT listing_id,MATCH(search) AGAINST(?) as relevance FROM search WHERE MATCH(search) AGAINST(?) LIMIT 1000'); 
    $sth->execute($db_search,$db_search); 
    my $results = $sth->fetchall_hashref('listing_id'); 
    

    これは、SQL文を変更$db_searchの内容を防ぎます。

  • +0

    あなたの最初の質問に答えるには、1. db_hoh()メソッドの最後の返り値は "return%hoh;"です。 2.私のnarrow_results_hashメソッドでは、この "join( '、'、keys%results);のようにmy%resultsハッシュでjoinを使用します;これを印刷して、narrow_results_hashコールの周りのif文を削除すると、 "107,99,34"のようなリストが表示されます。しかし、if文が呼び出しの周りに存在する場合、私はこれを取得します:HASH(0x7fd61fbf0580)。 – srchulo

    +0

    あなたはどのPerlのバージョンを使用していますか?バージョン[5.14](http://p3rl.org/perl5140delta)から、['keys'](http://p3rl.org/keys)のような多くの関数は参照やハッシュ(配列)を取ることができ、自動的に逆参照されます。直接印刷の結果はHASH(0xnnnnnnn)なので、あなたは間違いなくハッシュ値を持つことになります。それはさらに逆参照を必要とするように見えます。 –

    +0

    バージョン5.8.8を使用しています。 – srchulo

    関連する問題