在日常工作中,经常会遇到需要把多个文本ref="/tag/182/" style="color:#3D6345;font-weight:bold;">文件合并成一个文件的情况。比如日志分析、数据整理,或者批量处理一些配置文件。手动一个一个复制粘贴太麻烦,这时候用Perl写个小脚本就方便多了。
最简单的合并方式
假设你有一堆以 .txt 结尾的文件,想把它们的内容全部合并到一个叫 merged.txt 的文件里。下面这段Perl代码就能搞定:
open(OUT, >>merged.txt<>) or die $!;
for my $file (glob <*.txt>) {
open(IN, <$file<>) or warn "无法打开 $file: $!\n"; # 跳过打不开的文件
while () {
print OUT $_;
}
close(IN);
}
close(OUT);
这里用到了 glob 函数来获取所有匹配的文件名,然后逐个读取内容写入目标文件。如果不想在每段内容之间连得太紧,可以在每个文件结束后加一行空行或分隔符:
print OUT "\n--- 来自 $file ---\n\n";
按文件名排序后再合并
有时候文件命名是有规律的,比如 log1.txt、log2.txt……直接用 glob 可能顺序不对。这时候可以加上 sort:
for my $file (sort glob <*.txt>) {
这样就会按字母顺序处理文件,保证合并顺序合理。
跳过大文件或特定文件
有些场景下,可能不想合并某些临时文件,比如以 ~ 结尾的备份文件。可以在循环里加个判断:
next if $file =~ /~$/; # 跳过以 ~ 结尾的文件
或者限制只处理小于1MB的文件:
next if -s $file > 1_000_000; # 超过1MB跳过
带命令行参数的灵活版本
如果你经常要用这个功能,可以把输入和输出作为参数传进去:
my $output = shift @ARGV || 'merged.txt';
my @files = @ARGV ? @ARGV : glob <*.txt>;
open(OUT, >>$output<>) or die $!;
for my $file (@files) {
next unless -f $file;
open(IN, <$file<>) or warn "$file: $!\n";
while () {
print OUT $_;
}
close(IN);
}
close(OUT);
保存为 merge.pl 后就可以这样运行:
perl merge.pl output.txt file1.txt file2.txt
或者不加参数,默认合并当前目录所有 .txt 文件。
这种小脚本虽然简单,但在处理几十上百个文本片段时特别省事。不需要安装额外模块,只要有Perl环境,几行代码就能解决问题。