我有数百行这样的行,其中只有变量名称发生变化(它们都具有相同的值)
# no change required here
my $worksheet_stats = $workbook->add_worksheet('Stats');
my $worksheet_blockleave = $workbook->add_worksheet('Block Leave ');
my $worksheet_disabled = $workbook->add_worksheet('Disabled Users');
my $worksheet_past = $workbook->add_worksheet('EX Users');
# dirty (what i want to simplify without having to touch at the rest of the code as the script is huge)
$worksheet_blockleave->write( 0, 0, "GPN" );
$worksheet_blockleave->write( 0, 1, "Firstname" );
$worksheet_blockleave->write( 0, 2, "Lastname" );
$worksheet_blockleave->set_column( 0, 1, 30 );
$worksheet_blockleave->set_column( 0, 2, 30 );
$worksheet_disabled->write( 0, 0, "GPN" );
$worksheet_disabled->write( 0, 1, "Firstname" );
$worksheet_disabled->write( 0, 2, "Lastname" );
$worksheet_disabled->set_column( 0, 1, 30 );
$worksheet_disabled->set_column( 0, 2, 30 );
$worksheet_past->write( 0, 0, "GPN" );
$worksheet_past->write( 0, 1, "Firstname" );
$worksheet_past->write( 0, 2, "Lastname" );
$worksheet_past->set_column( 0, 1, 30 );
$worksheet_past->set_column( 0, 2, 30 );
...
# doing other stuff with these variables later (that i don't want to change)
$worksheet_blockleave->write( blabla, 0, blabla );
....
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以创建一个循环,将设置应用于所有这些事情,而不必提及整个变量名称?(简化代码并减少它)
类似的东西(没有尝试过,我相信它不会起作用):
foreach ("blockleave", "disabled", "past", "xxx", ...... )
{
$worksheet_${_}->write( 0, 0, "GPN" );
$worksheet_${_}-->write( 0, 1, "Firstname" );
$worksheet_${_}-->write( 0, 2, "Lastname" );
$worksheet_${_}-->set_column( 0, 1, 30 );
$worksheet_${_}-->set_column( 0, 2, 30 );
}
Run Code Online (Sandbox Code Playgroud)
事实上这是有效的:
foreach ($worksheet_blockleave,$worksheet_disabled,$worksheet_past,$worksheet_future,$worksheet_t2,$worksheet_t4,$worksheet_t24,$worksheet_enabled,$worksheet_VR,$worksheet_USBW,$worksheet_USBR,$worksheet_P08,$worksheet_ZH) {
$_->write( 0, 0, "GPN" );
$_->write( 0, 1, "Firstname" );
$_->write( 0, 2, "Lastname" );
$_->set_column( 0, 1, 30 );
$_->set_column( 0, 2, 30 );
}
Run Code Online (Sandbox Code Playgroud)
但我希望有一个更短的解决方案,我不必指定 $worksheet_ 前缀来节省一些空间并澄清脚本一点。
提前致谢
不要使用变量变量名。您可以使用哈希。
for (qw( blockleave disabled past ... )) {
my $worksheet = $worksheets{$_};
$worksheet->write( 0, 0, "GPN" );
$worksheet->write( 0, 1, "Firstname" );
$worksheet->write( 0, 2, "Lastname" );
$worksheet->set_column( 0, 1, 30 );
$worksheet->set_column( 0, 2, 30 );
}
Run Code Online (Sandbox Code Playgroud)