【问题标题】:variable substitution in variable name变量名中的变量替换
【发布时间】:2022-01-04 14:18:21
【问题描述】:

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

# 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 );
....

有没有办法创建一个循环,将设置应用于所有这些事情,而不必提及整个变量名? (简化代码并减少它)

类似的东西(没有尝试过,我相信它不会起作用):

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 );
}

事实上这是有效的:

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 );
}

但我希望有一个更短的解决方案,我不必指定 $worksheet_ 前缀来节省一些空间并稍微澄清脚本..

提前致谢

【问题讨论】:

    标签: perl


    【解决方案1】:

    Don't use a variable variable name。你可以使用哈希。

    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 );
    }
    

    【讨论】:

    • 很有趣,但它不起作用:(我编辑了我的初始帖子以展示我如何定义这些变量。
    • 它确实有效。你用了哈希吗?
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 2017-07-26
    • 2021-09-28
    • 1970-01-01
    • 2020-08-14
    • 2020-10-04
    • 2015-01-30
    • 2015-01-18
    相关资源
    最近更新 更多