求助:Perl脚本无法获取指定目录子目录及对应图片质量信息
问题分析与修复方案
原脚本存在几个关键问题:
- 输入路径未处理换行符:
<STDIN>读取的内容包含末尾换行,导致路径拼接后带无效换行符,无法匹配目标目录 - system命令语法错误:多余的
"good"参数完全无效,且ls仅能列出文件路径,根本无法读取quality.txt内的内容 - 对system返回值误解:system返回的是命令的退出状态码(0表示执行成功),不是目录或文件内容,所以
print $dir输出的是状态码而非预期结果
修复后的脚本
#!/usr/bin/perl use strict; use warnings; use File::Basename; # 用于提取目录短名称 # 读取输入路径并去除末尾换行 my $path = <STDIN>; chomp $path; # 打开输出文件,失败则报错退出 open my $out_fh, '>', 'temp.txt' or die "无法创建temp.txt: $!"; # 匹配目标路径下所有以image_开头的子目录 my @image_dirs = glob("$path/image_*"); foreach my $dir (@image_dirs) { # 跳过非目录项 next unless -d $dir; my $quality_file = "$dir/quality.txt"; # 跳过不存在quality.txt的目录 next unless -f $quality_file; # 读取quality.txt内容 open my $q_fh, '<', $quality_file or do { warn "无法读取$quality_file: $!"; next; }; my $quality = <$q_fh>; chomp $quality; # 去除内容里的换行符 close $q_fh; # 提取目录的短名称(如从完整路径中取出image_user_1) my $dir_name = basename($dir); # 按格式写入输出文件 print $out_fh "$dir_name $quality\n"; } close $out_fh; print "处理完成,结果已写入temp.txt\n";
关键改进点
- 用
chomp清理输入路径的换行符,避免路径匹配失效 - 用Perl内置的
glob替代ls,更安全且符合Perl最佳实践 - 显式检查目录和文件是否存在,避免无意义的报错
- 使用
File::Basename提取目录短名称,完全匹配期望的输出格式 - 逐行读取并处理每个
quality.txt的内容,确保输出格式正确
执行脚本后,temp.txt会生成符合要求的内容,示例:
image_user_1 good image_user_2 bad image_user_10 bad
内容的提问来源于stack exchange,提问作者kcv9712
相关产品推荐
相关产品推荐

