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

Perl+MySQL项目无法按预期展示内容及关联内容问题求助

解决Perl项目中关联内容输出异常的问题

看起来你的代码主要有几个核心问题导致输出不符合预期,我来帮你一步步梳理并修正:

问题根源分析

  1. 子函数定义位置错误:你把query_person_by_target定义在了query_sponsor的while循环内部,Perl不允许在循环里重复定义子函数,这会直接导致作用域混乱,甚至提前终止sponsor的查询循环。
  2. 变量作用域与句柄误用:子函数里直接引用外部循环的$row['1'],没有通过参数传递,容易引发变量引用错误;同时子函数里错误调用$sth->finish(),关闭的是sponsor查询的语句句柄,导致sponsor循环只执行一次就停止。
  3. 输出结构不匹配需求:你用了HTML表格来输出,但预期是带有缩进的层级文本结构,表格的布局逻辑和你想要的展示效果完全不兼容。

修正后的代码

下面是调整后的代码,完全匹配你给出的样例输出格式(纯文本缩进),如果需要HTML格式可以再做微调:

#!C:/Perl64/bin/perl.exe
use strict;
use warnings;
use v5.10; # for say() function
use DBI;

# MySQL database configurations
my $dsn = "DBI:mysql:naxum";
my $username = "root";
my $password = '';

# connect to MySQL database
my %attr = ( 
    PrintError=>0,  # turn off error reporting via warn()
    RaiseError=>1   # report error via die()
);
my $dbh = DBI->connect($dsn,$username,$password,\%attr);

# 先执行主查询
query_sponsor($dbh);

# 将关联查询函数移到外部,作为独立子函数
sub query_person_by_target{
    my ($dbhPerson, $sponsor_id) = @_;
    my $sqlPerson = "SELECT username, firstname FROM person WHERE sponsor_id = ?";
    my $sthPerson = $dbhPerson->prepare($sqlPerson);
    $sthPerson->execute($sponsor_id) or die "execution failed: " . $dbhPerson->errstr();
    
    while ( my @rowPerson = $sthPerson->fetchrow_array()){
        # 输出缩进的关联内容,用8个空格匹配样例格式
        print "        $rowPerson[0]\n";
    }
    $sthPerson->finish(); # 关闭当前person查询的句柄,避免影响外部查询
}

sub query_sponsor{
    my ($dbh) = @_;
    my $sql = "SELECT name,id FROM sponsor";
    my $sth = $dbh->prepare($sql);
    $sth->execute();

    while(my @row = $sth->fetchrow_array()){
        # 输出主内容,前面加3个空格匹配样例
        print "   $row[0]\n";
        # 调用关联查询,传入当前sponsor的ID
        query_person_by_target($dbh, $row[1]);
    }
    $sth->finish();
}

$dbh->disconnect();

关键调整说明

  • 子函数位置优化:把query_person_by_target移到query_sponsor外部,彻底避免循环内重复定义子函数的问题。
  • 明确参数传递:给关联查询函数增加$sponsor_id参数,明确传递当前要查询的sponsor ID,彻底解决变量作用域混乱的问题。
  • 句柄正确管理:在子函数里关闭的是$sthPerson(person查询的句柄),而非外部的sponsor查询句柄,保证sponsor的查询循环能完整执行。
  • 输出结构匹配需求:去掉了HTML表格,改成纯文本缩进格式,完全对齐你给出的样例输出样式。

如果需要HTML格式的层级展示(比如嵌套列表),可以把输出逻辑改成这样:

# 在query_sponsor函数内
print "   <div class='content-item'>$row[0]</div>\n";
print "   <ul class='related-list'>\n";
query_person_by_target($dbh, $row[1]);
print "   </ul>\n";

# 在query_person_by_target函数内
print "       <li>$rowPerson[0]</li>\n";

内容的提问来源于stack exchange,提问作者user2338925

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:22:11