【问题标题】:Can't use string as a ARRAY ref while "strict refs" in use使用“严格引用”时不能将字符串用作数组引用
【发布时间】:2016-12-11 03:07:34
【问题描述】:

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

它给了我一个错误

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

【问题讨论】:

  • "不能使用字符串作为 HASH 引用..." "不能使用字符串作为 ARRAY 引用..." 它是什么?错误在哪一行?
  • 我发了foreach (@arrFiles) { #Line 247
  • Can't use string ("Server/Systems/Handlers/Buddies."...) as an ARRAY ref while "strict refs" in use at Server/ClubPenguin.pm line 247 是正确的错误
  • 这怎么可能?您没有在运行时加载该模块(至少,不在您发布的代码中),我怀疑您是在编译时加载它。错误信息很清楚:也许您忘记加载“好友”?
  • 而且,就像@smarx 在他的comment 中提到的那样,模块的加载是一个单独的问题。

标签: perl


【解决方案1】:

我认为你只需要这个:

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

【讨论】:

  • 我收到此错误Can't locate object method "new" via package "Buddies" (perhaps you forgot to load "Buddies"?) at Server/ClubPenguin.pm line 249.
  • 我不确定这与手头的问题有关。您的代码中的问题是逗号连接了您的列表,因此您只需要一个循环来遍历所有元素。
  • 你可能需要require你找到的模块? require $_; 或许?
  • 好吧,我在这里使用包名;
  • 无论如何,这是题外话。如果您需要有关此新问题的帮助,请提出新问题。
【解决方案2】:

问题在于这条线

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

只需将两个数组@arrHandlers@arrGames 的内容组合成一个数组。它不会像您期望的那样创建包含两个引用的数组

你只需要写

for ( @arrFiles ) {
    ...
}

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

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

效果一样

【讨论】:

    猜你喜欢
    • 2020-05-22
    • 2014-07-18
    • 2017-05-25
    • 2020-02-21
    • 2018-04-08
    • 1970-01-01
    • 2023-03-31
    • 2015-06-18
    相关资源
    最近更新 更多