Perl中如何通过变量名替换简化Excel工作表重复初始化代码?
Perl工作表初始化重复代码简化方案
方案1:合并工作表创建与初始化逻辑(最简洁,全兼容后续代码)
该方案将原来分散的变量声明、工作表创建、初始化操作全部整合,后续新增工作表仅需新增一行配置,原有调用逻辑无需任何修改:
# 仅需在此维护所有工作表的后缀标识与显示名称 my %sheet_config = ( stats => 'Stats', blockleave => 'Block Leave', disabled => 'Disabled Users', past => 'EX Users', # 其余工作表按格式在此添加即可 ); no strict 'refs'; # 临时开放符号引用权限 while (my ($suffix, $sheet_name) = each %sheet_config) { # 等价于原代码的 my $worksheet_xxx = $workbook->add_worksheet(...) ${ "worksheet_$suffix" } = $workbook->add_worksheet($sheet_name); # 统一执行初始化逻辑 ${ "worksheet_$suffix" }->write(0, 0, "GPN"); ${ "worksheet_$suffix" }->write(0, 1, "Firstname"); ${ "worksheet_$suffix" }->write(0, 2, "Lastname"); ${ "worksheet_$suffix" }->set_column(0, 1, 30); ${ "worksheet_$suffix" }->set_column(0, 2, 30); } use strict 'refs'; # 恢复严格检查
使用该方案后,原有$worksheet_blockleave->write(...)等后续调用逻辑完全无需修改。
方案2:仅简化初始化逻辑(不改动原有工作表创建代码)
如果你不想修改已经写好的工作表创建声明,仅需要简化初始化部分的循环,可以用以下写法,无需重复写$worksheet_前缀:
# 仅列出所有工作表的后缀标识即可 my @init_sheets = qw(blockleave disabled past future t2 t4 t24 enabled VR USBW USBR P08 ZH); no strict 'refs'; foreach my $suffix (@init_sheets) { my $sheet = ${ "worksheet_$suffix" }; $sheet->write(0, 0, "GPN"); $sheet->write(0, 1, "Firstname"); $sheet->write(0, 2, "Lastname"); $sheet->set_column(0, 1, 30); $sheet->set_column(0, 2, 30); } use strict 'refs';
注意事项
如果你的$worksheet_xxx变量是用my声明的词法变量,符号引用无法访问,仅需要将这些变量的声明关键字从my改为our即可,后续所有调用逻辑不需要做任何修改即可正常运行。
内容的提问来源于stack exchange,提问作者olivierg
相关产品推荐
相关产品推荐

