变量名中的变量替换

oli*_*erg 1 perl

我有数百行这样的行,其中只有变量名称发生变化(它们都具有相同的值)

# 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_ 前缀来节省一些空间并澄清脚本一点。

提前致谢

ike*_*ami 6

不要使用变量变量名。您可以使用哈希。

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)