Perl实现目录下文本文件共有行查找的方法咨询
Perl批量查找目录下所有txt文件共有行实现方案
快速实现逻辑(无需深挖复杂知识点,跑通优先)
核心逻辑不用搞复杂算法,用Perl原生哈希做统计即可,3步走:
- 统计目标目录下txt文件总数量
- 逐文件读取内容时,记录每一行出现在多少个不同的文件中(单文件内重复的同一行只计数1次,避免统计误差)
- 所有文件读取完成后,筛选出「出现文件数 = 总文件数」的行,就是所有文件的共有行
基于你现有代码修改后的可直接运行版本
use strict; use warnings; use English; my $dir = 'C:\Perl_Example\Data'; my %line_count; # 键:行内容,值:该行出现在多少个不同文件中 my $total_txt = 0; # 目录下txt文件总数 foreach my $fp (glob("$dir/*.txt")) { $total_txt++; printf "正在读取文件:%s\n", $fp; open my $fh, "<", $fp or die "无法打开文件 '$fp': $OS_ERROR"; my %current_file_seen; # 标记当前文件里已经统计过的行,避免同文件重复行多计数 while (my $line = <$fh>) { chomp $line; # 去掉行尾换行符,避免不同系统换行符差异导致匹配失败 # 可选:如果需要忽略行首尾空白,取消下一行的注释即可 # $line =~ s/^\s+|\s+$//g; next if exists $current_file_seen{$line}; $current_file_seen{$line} = 1; $line_count{$line}++; } close $fh or die "无法关闭文件 '$fp': $OS_ERROR"; } # 输出所有共有行 print "\n===== 所有txt文件共有的行如下 =====\n"; foreach my $common_line (keys %line_count) { if ($line_count{$common_line} == $total_txt) { print "$common_line\n"; } }
时间紧张情况下优先掌握的核心知识点(不用系统学,用到查语法即可)
- Perl哈希(Hash)的基本操作:存取值、判断键是否存在,哈希是Perl做频次统计、去重的最高效原生结构,这个需求90%的逻辑都靠它实现
chomp函数的作用:移除行尾的换行符,是处理文本行读取时的必用函数,避免因为换行符格式差异导致本应相同的行匹配失败- 临时哈希去重逻辑:单文件读取时用临时哈希标记已经统计过的行,解决单文件内重复行导致的统计偏差
注意:如果你的单个文件体积特别大(超过百MB),这个逻辑依然可以正常运行,内存占用只会和不同行的总数量正相关,不会把整个文件全部加载进内存,性能足够应对绝大多数日常场景。
内容的提问来源于stack exchange,提问作者abcd
相关产品推荐
相关产品推荐

