“访问”;“外部”;Perl数组来自";“开始”;块/包
下面是我试图修改的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
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个错误是由于其他问题造成的。谢谢