私はかなり些細なことであるはずの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_hash
にnarrow_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)"と表示されます。
「うまくいかない」(http://catb.org/~esr/faqs/smart-questions.html#beprecise)とはどういう意味ですか?また、サンプルコードを[最小限のテストケース](http://sscce.org/)に減らしてください。それは単なるものではありません。 – outis
Re: "私は自分のコード内でハッシュを渡します"、ハッシュをサブスカート(スカラーのリスト)に渡すことはできません。サブシステムはハッシュ(スカラーのリストのみ)を返すことはできません。 – ikegami
'%results'を見て、それがあなたが信じているようにハッシュのハッシュであることを確認するには、[Data :: Dumper](http://search.cpan.org/~smueller/Data-Dumper-2.131/Dumper.pm)を使用してください。 db_hohメソッドを検索しようとしましたが、DBIのマニュアルで見つけることができませんでした。私は 'db_hoh'がおそらく***参照***をハッシュのハッシュに戻していると思われます。 –