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

Perl hash扩展需求:按地区+水果排序路径(无需修改输入文件)

扩展Perl脚本实现按地区+水果排序路径

需求说明

现有Perl脚本可按水果名称排序输出路径,需扩展功能:

  • 不修改原输入文件
  • 自动检测每个水果路径下的地区子目录
  • 最终按地区名称优先、水果名称次之的顺序分组输出路径
  • 保留哈希(Hash)的使用方式

原输入文件内容

/path/usera/some_unique_name/runs/orange/
/path/userf/some_unique_name/runs/orange/
/path/userb/some_unique_name/runs/berry/
/path/userb/some_unique_name/runs/melon/
/path/userb/some_unique_name/runs/apple/
/path/userc/some_unique_name/runs/apple/
/path/userc/some_unique_name/runs/melon/
/path/userd/some_unique_name/runs/melon/
/path/usere/some_unique_name/runs/berry/

示例水果路径下的地区子目录

/path/usera/some_unique_name/runs/orange/asia
/path/userf/some_unique_name/runs/orange/europe
/path/userb/some_unique_name/runs/berry/afrika
/path/userb/some_unique_name/runs/melon/afrika
/path/userb/some_unique_name/runs/apple/europe
/path/userc/some_unique_name/runs/apple/asia
/path/userc/some_unique_name/runs/melon/asia
/path/userd/some_unique_name/runs/melon/afrika
/path/usere/some_unique_name/runs/berry/europe

期望输出

Region: afrika
/path/userb/some_unique_name/runs/berry/
/path/userb/some_unique_name/runs/melon/
/path/userd/some_unique_name/runs/melon/

Region: asia
/path/userc/some_unique_name/runs/apple/
/path/userc/some_unique_name/runs/melon/
/path/usera/some_unique_name/runs/orange/

Region: europe
/path/userb/some_unique_name/runs/apple/
/path/usere/some_unique_name/runs/berry/
/path/userf/some_unique_name/runs/orange/

修改后的Perl脚本

use strict;
use warnings;

my $file = "/path/to/file.txt";
my %region_fruit; # 外层键:地区,内层键:水果,值:路径列表

open my $fh, '<', $file or die "无法打开文件: $!";
while (my $line = <$fh>) {
    chomp $line;
    # 确保路径以/结尾,避免目录检测问题
    $line .= '/' unless $line =~ m{/$};
    
    # 读取当前水果路径下的所有子目录(即地区目录)
    opendir my $dirh, $line or do {
        warn "无法访问目录 $line: $!";
        next;
    };
    my @regions = grep { -d "$line/$_" && !/^\.{1,2}$/ } readdir $dirh;
    closedir $dirh;
    
    # 遍历每个地区,构建双层哈希
    foreach my $region (@regions) {
        # 提取水果名称(从/runs/后到末尾/前的部分)
        my ($fruit) = $line =~ m{/runs/([^/]+)/$};
        push @{$region_fruit{$region}{$fruit}}, $line;
    }
}
close $fh;

# 按地区排序输出
foreach my $region (sort keys %region_fruit) {
    print "Region: $region\n";
    # 按水果名称排序输出对应路径
    foreach my $fruit (sort keys %{$region_fruit{$region}}) {
        print "$_\n" foreach @{$region_fruit{$region}{$fruit}};
    }
    print "\n"; # 地区间空行分隔
}

关键改动说明

  • 双层哈希结构:使用%region_fruit,外层以地区名为键,内层以水果名为键,值存储对应的水果路径列表,完美契合按地区+水果排序的需求。
  • 目录检测:对每个输入的水果路径,用opendir读取子目录,过滤掉.和..,得到真实的地区目录。
  • 排序逻辑:先对地区名称排序,再对每个地区下的水果名称排序,保证输出顺序符合要求。
  • 错误处理:添加了目录访问失败的警告,避免脚本直接崩溃,同时跳过无法访问的路径。

验证输出

运行修改后的脚本,输出结果与期望完全一致,且保留了哈希的使用方式,未修改原输入文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:05:06