【发布时间】:2011-12-26 11:20:12
【问题描述】:
我正在尝试在 Perl 5.8.8 中传递哈希引用,我知道这应该是一件非常微不足道的事情。我在代码中到处传递哈希值,但由于某种原因,它在这个子例程中不起作用:
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";
# ...
}
如果我在 build_results_hash 中删除 narrow_results_hash 调用周围的 if 语句,它会打印:“107,99,34”。但是,如果在调用周围出现if 语句,它会打印“HASH(0x7fd61fbf0580)”。
【问题讨论】:
-
“不起作用”的do you mean 到底是什么?另外,请将示例代码缩减为minimal test case。事实上,它不是独立的。
-
关于“我在代码中到处传递哈希值”,不能将哈希值传递给 subs(只是一个标量列表),并且 subs 不能返回哈希值(只是一个标量列表)。
-
使用Data::Dumper 查看
%results并确保它是您认为的哈希值。我尝试查找 db_hoh 方法,但在 DBI 文档中找不到它。我怀疑db_hoh可能正在将 reference 返回到哈希哈希。
标签: perl hash reference subroutine