“访问”;“外部”;Perl数组来自";“开始”;块/包

“访问”;“外部”;Perl数组来自";“开始”;块/包,perl,Perl,下面是我试图修改的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

下面是我试图修改的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(“需要显式包名”)

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

我认为这可能是因为在开始计算该块时没有设置%ARR,我可能需要调用“sub C”,但
&main::C()似乎也失败了

如何在那里访问此阵列

我已经看过了:它似乎在处理类似的主题,但却在努力正确理解答案

**编辑** 展开的骨架脚本显示了一些向前推进的尝试:

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中被调用时有效,但当独立运行时,this和
&main::C()
都失败。在定义接头之前,可能在康普利尔时间完成独立呼叫

顺便说一句,我尝试了
我们的
定义,但得到了一个502错误:


也许这是因为数组不可用?

%main:ARR
$main::ARR{index}
对于您提供的代码框架是正确的(好吧,任何东西都是正确的,因为您没有说
使用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;
    }
}

...

您是否也查看了
我的
我们的
本地
。我认为这与perl的作用域机制有关,因为您的问题似乎根源于此。只需使用
$main::ARR{…}
/
%main::ARR
将获得正确的变量(正如@mob所建议的那样声明
our%ARR;
),但只有您能够判断XYZ::中的sub是否在C()之前被调用调用,并按预期设置变量。建议(在文档中)在Perl 5.6版以上不要使用
use vars
。使用
our
,或者最好使用
my
。你说
&main::C()
失败了吗?如何处理?@ysth我在日志中的/path/to/file.pl行123
处调用了
未定义的子例程&main::C,因此出现了一个500内部服务器错误。这解决了问题。我收到的502个错误是由于其他问题造成的。谢谢