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

求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:36:13