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

Perl技术问询:查找重复文件名并添加到哈希数组

解决Perl中构建哈希数组追踪重复文件名的问题

我来帮你搞定这个需求!先提个容易踩的小坑:你原代码里的split /:/, line;少了变量前的美元符号,应该写成split /:/, $line;,不然会触发编译错误哦。

接下来咱们一步步实现用哈希数组(hash of arrays)追踪重复文件名的功能:

核心思路

我们要创建一个哈希,其中键是你要检查重复的文件名(这里默认是import-filename,你也可以换成source-filename),值是一个数组,数组里存储所有包含该文件名的行的完整信息(类型、源文件、导入文件)。这样后续就能轻松筛选出出现多次的文件名。

完整代码示例

# 初始化哈希数组:键为文件名,值为存储该行信息的数组引用
my %filename_entries;

while (my $line = <$log_fh>) {
    chomp $line; # 先去掉换行符,避免干扰字段处理
    
    # 按冒号拆分每行
    my ($log_type, $log_source_filename, $log_import_filename) = split /:/, $line;
    
    # 批量修剪所有字段的前后空白,简化重复代码
    foreach my $field ($log_type, $log_source_filename, $log_import_filename) {
        $field =~ s/^\s+|\s+$//g;
    }
    
    # 将当前行的信息以数组形式存入对应文件名的数组中
    # 如果你想让数据结构更清晰,也可以用哈希引用替代数组
    push @{$filename_entries{$log_import_filename}}, [
        $log_type,
        $log_source_filename,
        $log_import_filename
    ];
}

# 遍历哈希,筛选并输出重复的文件名及其对应条目
foreach my $filename (keys %filename_entries) {
    my $entries = $filename_entries{$filename};
    # 数组长度大于1说明该文件名重复
    if (@$entries > 1) {
        print "文件名 '$filename' 重复出现了 " . scalar(@$entries) . " 次:\n";
        foreach my $entry (@$entries) {
            # 输出数组中的每个字段
            print "  类型: $entry->[0], 源文件: $entry->[1], 导入文件: $entry->[2]\n";
        }
    }
}

关键细节说明

  1. 自动创建数组引用:Perl会自动为哈希中不存在的键创建空数组引用,所以不用提前初始化每个键的数组,直接push即可。
  2. 简化空白修剪:用foreach循环批量处理三个字段,避免重复写三次替换代码,更简洁易维护。
  3. 灵活切换追踪对象:如果你想追踪source-filename的重复,只需要把$log_import_filename换成$log_source_filename作为哈希的键就行。
  4. 可选的哈希引用存储:如果觉得数组下标不够直观,可以把每个条目改成哈希引用,比如:
    push @{$filename_entries{$log_import_filename}}, {
        type   => $log_type,
        source => $log_source_filename,
        import => $log_import_filename
    };
    
    后续输出时就可以用$entry->{type}这样的方式访问字段,可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:43:41