从 "BEGIN" Block/Package 访问 "external" Perl 数组

Access "external" Perl Array from "BEGIN" Block/Package

下面是我尝试修改的 perl 脚本的简化版本:

use MODULE_1 ;
use MODULE_2 ;
use vars qw(%ARR  $VarZZ) ;

sub A {
    # Somestuff

    # Call to Sub B
    B() ;
    # Call to Sub C
    C() ;
}

BEGIN {
    package XYZ ;
    use vars qw($VarYY  $VarXX) ;
    # MISC SUBS HERE
    # end of package XYZ
}

sub B {
    # Somestuff
}

sub C {
    # Somestuff to set %ARR
}

# Call to Sub A
A() ;

我的问题是,我想在包 XYZ BEGIN 块中访问 %ARR,但不断收到错误消息,提示我需要定义 %ARR ("requires explicit package name")

我试过,试图在块中复制一个类似的例子,$main::ARR{index}但到目前为止失败了。

我认为这可能是因为在开始评估该块时未设置 %ARR,我可能需要调用 "sub C",但 &main::C(); 似乎也失败了。

我如何在那里访问这个数组?

我看过:Perl's main package - block syntax - pragmas and BEGIN/END blocks 似乎在解决类似的主题,但很难正确理解答案

** 编辑 **

扩展的骨架脚本显示了一些向前推进的尝试:

use MODULE_1 ;
use MODULE_2 ;
use vars qw(%ARR  $VarZZ) ;

sub A {
    # Somestuff

    # Call to Sub B
    B() ;
    # Call to Sub C
    C() ;
    # Call to Sub E
    E() ;
}

sub E {
    # Call to Package XYZ subs
}

BEGIN {
    package XYZ ;
    use vars qw($VarYY  $VarXX %ARR) ;

    # I tried to Call to Sub C and load a local version of %ARR
    #
    # This fails with "Undefined subroutine &main::C" error
    &main::C() ;
    #
    # We never get here so not sure if correct
    %ARR = &main::ARR ;


    # MISC SUBS HERE
        sub X {
            # Call to Sub D
            &main::D() ;
        }
    # end of package XYZ
}

sub B {
    # Somestuff
}

sub C {
    # Somestuff to set %ARR
}
sub D {
    # Somestuff
}

# Call to Sub A
A() ;

请注意,对 &main::E() 的调用在 XYZ 包中的 Subs 中调用时有效,但当 运行 独立时,此调用和 &main::C() 均失败。也许在定义 subs 之前,独立调用是在编译时完成的。

顺便说一句,我尝试了 our 定义,但出现 502 错误:Nginx Debug Log

可能是因为数组不可用?

%main:ARR$main::ARR{index} 对于您提供的代码框架是正确的(好吧,任何事情都是正确的,因为您没有说 use strict,但无论如何......)。 main 是否有可能不是正确的命名空间(即 use vars ... 之前是否有一些 pacakge 语句)?

在任何情况下,您都可以使用 our 关键字解决此问题。如果您在顶层声明它,它将在整个文件的其余部分具有作用域:

package ABC;
our %ARR;      # %ABC::ARR

sub foo {
   $ARR{"key"} = "value";  # %ABC::ARR
}

{   # "BEGIN" optional
    package XYZ;
    our %Hash;    # %XYZ::Hash
    sub bar {
        my $key1 = $Hash{"key1"};  # %XYZ::Hash
        my $val1 = $ARR{$key1};    # %ABC::ARR
        $ARR{$val1} = $key1;
    }
}

...