如何在Perl中为匹配模式的哈希键赋值并生成Excel?
Perl 哈希处理与 Excel 生成解决方案
完整代码实现
use strict; use warnings; use Excel::Writer::XLSX; # 配置参数 my $input_file = 'your_input_file.txt'; # 替换为你的输入文件路径 my $pattern = qr/your_target_pattern/; # 替换为你的匹配模式(正则) my $tag_string = '匹配成功'; # 替换为要添加的指定字符串 my $output_excel = 'file_content.xlsx'; # 输出Excel文件名 # 1. 读取文件到哈希,存储行号、行内容及标记位 my %file_data; open my $fh, '<', $input_file or die "无法打开文件: $!"; while (my $line = <$fh>) { chomp $line; my $line_num = $.; # 获取当前行号 $file_data{$line_num} = { content => $line, tag => '' }; } close $fh; # 2. 匹配指定模式,为对应行添加标记字符串 foreach my $line_num (keys %file_data) { if ($file_data{$line_num}{content} =~ $pattern) { $file_data{$line_num}{tag} = $tag_string; } } # 3. 生成Excel表格 my $workbook = Excel::Writer::XLSX->new($output_excel); die "无法创建Excel文件: $!" unless defined $workbook; # 创建工作表并设置表头 my $worksheet = $workbook->add_worksheet('文件内容'); my @headers = ('行号', '行内容', '标记'); my $header_format = $workbook->add_format(bold => 1, align => 'center'); $worksheet->write_row('A1', \@headers, $header_format); $worksheet->set_column(1, 1, 50); # 调整行内容列宽度,避免内容截断 # 写入数据(按行号排序,保证顺序与原文件一致) my $row_idx = 1; foreach my $line_num (sort { $a <=> $b } keys %file_data) { $worksheet->write($row_idx, 0, $line_num); $worksheet->write($row_idx, 1, $file_data{$line_num}{content}); $worksheet->write($row_idx, 2, $file_data{$line_num}{tag}); $row_idx++; } $workbook->close(); print "Excel文件已生成: $output_excel\n";
关键部分说明
哈希结构设计:
用哈希引用作为哈希值,同时存储行内容和标记位,避免直接修改原行内容导致的混乱,后续扩展字段也更方便。正则匹配处理:
使用qr//编译正则表达式,提升匹配效率;如果需要匹配精确字符串,可改用qr/\Q目标字符串\E/,避免正则元字符干扰。Excel生成细节:
- 设置表头格式(加粗、居中)提升可读性
- 调整行内容列宽度,防止长文本截断
- 按行号排序后写入数据,保证Excel中的行顺序与原文件一致
注意事项
- 若尚未安装
Excel::Writer::XLSX模块,可通过命令行安装:cpanm Excel::Writer::XLSX - 替换代码中的配置参数(输入文件路径、匹配模式、标记字符串)为你的实际需求
- 150行文件的规模无需担心内存问题,若处理超大文件可改为边读边写的流式模式
内容的提问来源于stack exchange,提问作者Itsme
相关产品推荐
相关产品推荐

