使用“严格参考”时,不能使用字符串作为ARRAY参考

时间:2016-08-04 20:17:32

标签: perl

我一直在尝试从位于Handlers文件夹中的两个文件夹GamesSystem中加载文件。

它给了我一个错误

Can't use string ("Server/Systems/Handlers/Buddies."...) as an ARRAY ref while "strict refs" in use at Server/ClubPenguin.pm line 247`

这是代码

method loadSystems {

    my @arrHandlers = glob('Server/Systems/Handlers/*.pm');
    my @arrGames    = glob('Server/Systems/Games/*.pm');

    my @arrFiles    = ( @arrHandlers, @arrGames );

    foreach (@arrFiles) {    #Line 247

        foreach my $files ( @{$_} ) {

            my $strClass  = basename( $_, '.pm' );
            my $objSystem = $strClass->new($self);

            $self->{systems}->{$strClass} = $objSystem;
        }
    }

    my $sysCount = scalar( keys %{ $self->{systems} } );

    if ( $sysCount > 0 ) {
        $self->{modules}->{logger}->
                output( 'Successfully Loaded ' . $sysCount . ' Systems', Logger::LEVELS->{inf} );
    }
    else {
        $self->{modules}->{logger}->
                output( 'Failed To Load Any Systems', Logger::LEVELS->{err} );
    }
}

2 个答案:

答案 0 :(得分:1)

问题是这一行

my @arrFiles    = ( @arrHandlers, @arrGames );

只是将两个数组@arrHandlers@arrGames的内容合并到一个数组中。它不会像你期望的那样创建一个包含两个引用的数组

你需要写

for ( @arrFiles ) {
    ...
}

也无需复制原始数组,甚至无需存储glob调用的结果。你可以写

for ( glob 'Server/Systems/{Handlers,Games}/*.pm' ) {
    ...
}

效果相同

答案 1 :(得分:0)

我认为你需要这个:

foreach (@arrFiles) {
    my $strClass = basename($_, '.pm');
    my $objSystem = $strClass->new($self);
    $self->{systems}->{$strClass} = $objSystem;
}