Я пытаюсь передать хеш-ссылку в 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
, который окружает этот вызов метода, тогда хеш передается отлично! Я не уверен, что может вызвать такое поведение. Вот как я получаю хэш:
sub narrow_results_hash
{
use JSON::XS;
my $params = shift;
my %results = %$params;
# ...
print join(',',keys %results), "\n";
# ...
}
Если удалить if
заявление вокруг narrow_results_hash
вызова в build_results_hash
, он печатает: «107,99,34». Однако, если во время вызова присутствует оператор if
, он печатает «HASH (0x7fd61fbf0580)».
Что, собственно, [вы имеете в виду] (http://catb.org/~esr/faqs/smart-questions.html#beprecise) словами «не работает»? Кроме того, пожалуйста, уменьшите образец кода до [минимального тестового примера] (http://sscce.org/). Как бы то ни было, это не является самостоятельным. – outis
Re: «Я передаю хэши по всему месту в моем коде», нельзя передать хэши в subs (только список скаляров), а subs не может вернуть хэши (просто список скаляров). – ikegami
Используйте [Data :: Dumper] (http://search.cpan.org/~smueller/Data-Dumper-2.131/Dumper.pm), чтобы посмотреть «% результатов» и убедиться, что это хэш хэшей, как вы полагаете , Я попытался найти метод db_hoh, но не смог найти его в документации DBI. Я подозреваю, что 'db_hoh', вероятно, возвращает *** ссылку *** на хэш хешей. –