访问"外部"来自" BEGIN"的Perl数组块/包

时间:2015-01-12 00:18:40

标签: 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
    # 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();似乎也失败了。

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

我看过: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() ;

请注意,当在包XYZ中调用时,对&main::E()的调用有效,但在执行独立操作时,&main::C()our都会失败。也许独立呼叫是在定义潜艇之前的适当时间完成的。

BTW,我尝试了{{1}}定义,但收到了502错误:Nginx Debug Log

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

1 个答案:

答案 0 :(得分:1)

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

在任何情况下,您都可以使用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;
    }
}

...