Perl递归计算文件夹深度函数异常问题求助
问题分析与修复
你的Perl代码计算目录深度时出错,核心问题有两个:
1. 全局变量导致递归状态混乱
代码中$counter和$max_count未声明为局部变量,属于全局作用域。递归调用时,不同层级的函数会共享这两个变量的值,导致数值被随意覆盖,无法正确追踪当前递归层级。
2. 逻辑错误:混淆了子目录数量与层级深度
原代码的逻辑是统计当前目录下的子目录数量,而非递归的层级深度。每次进入子目录后$counter++,递归返回后直接将$counter置0,完全忽略了子目录内部的层级深度,自然无法得到正确结果。
修复后的代码
sub max_depth { my ($root) = @_; my $current_max = 0; # 遍历当前目录下的所有条目 for my $f (glob "$root/*") { # 如果是目录,递归计算其深度并加1(当前子目录为一层) if (-d $f) { my $sub_depth = max_depth($f) + 1; $current_max = $sub_depth if $sub_depth > $current_max; } } return $current_max; } my $col_number = max_depth($path); # $path 为目标目录路径 print $col_number;
代码说明
- 使用局部变量
$current_max记录当前目录的最大子目录深度,避免递归时的状态干扰。 - 递归计算每个子目录的深度,返回值加1代表当前子目录的层级,最终取所有子目录深度的最大值作为当前目录的深度。
- 若目录没有子目录,返回0,符合“内部子目录层级数”的定义。
测试时,当$path为/*****/Task9会返回4,设为/*****/Task9/new时返回3,与预期一致。
内容的提问来源于stack exchange,提问作者Priyansh Mehta
相关产品推荐
相关产品推荐

