You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:00:13