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
相关产品推荐
相关产品推荐

