下面是我试图修改的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
也许这是因为数组不可用?
答案 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;
}
}
...