Perl中如何遍历MySQL查询返回的哈希并提取数据?
Perl DBI查询返回结构异常及遍历问题
现有代码
查询函数
sub GetCategories { my $sth = $dbh->prepare("SELECT CatID, CatName, CatLink FROM Categories"); $sth->execute() or die $DBI::errstr; my $results = $sth->fetchall_arrayref({}); return($results); $sth->finish(); }
调用代码
my $Cats = $d2s->GetCategories(); my $vars = { categories => $Cats, };
问题现象
预期返回哈希数组结构:
'categories' => [ { 'CatID' => 1, 'CatLink' => './PostList.pl?cat=General', 'CatName' => 'General' }, { 'CatID' => 2, 'CatLink' => './PostList.pl?cat=DevOps', 'CatName' => 'DevOps' }, ... ]
但实际通过Data::Dumper输出的是数组引用的嵌套结构,内部元素为数组而非哈希:
$VAR1 = { 'categories' => \[ [ 1, 'General', './PostList.pl?cat=General' ], [ 2, 'DevOps', './PostList.pl?cat=DevOps' ] ] };
解决方案
1. 遍历当前异常结构提取值
当前$vars->{categories}是数组引用的引用,需先解引用再按索引访问:
# 提取第二个分类的名称(DevOps) print ${$vars->{categories}}[1][1]; # 遍历所有分类 foreach my $cat_arr (@{$vars->{categories}}) { my ($cat_id, $cat_name, $cat_link) = @$cat_arr; print "ID: $cat_id, Name: $cat_name, Link: $cat_link\n"; }
2. 修复函数得到预期的哈希数组结构
原函数存在两个问题:$sth->finish()在return之后不会执行,且fetchall_arrayref({})未返回预期的哈希数组。修复后的函数:
sub GetCategories { my $sth = $dbh->prepare("SELECT CatID, CatName, CatLink FROM Categories"); $sth->execute() or die $DBI::errstr; # 手动构建哈希数组,避免DBI配置导致的异常 my @results; while (my $row = $sth->fetchrow_hashref()) { push @results, $row; } $sth->finish(); # 移至return前确保执行 return \@results; }
修复后遍历预期结构
函数返回正确的哈希数组引用后,可按键名直接访问:
# 提取第二个分类的名称(DevOps) print $vars->{categories}->[1]->{CatName}; # 遍历所有分类 foreach my $cat_hash (@{$vars->{categories}}) { print "ID: $cat_hash->{CatID}, Name: $cat_hash->{CatName}, Link: $cat_hash->{CatLink}\n"; }
内容的提问来源于stack exchange,提问作者user3183111
相关产品推荐
相关产品推荐

