【发布时间】:2015-01-12 00:18:39
【问题描述】:
以下是我正在尝试修改的 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 中的 Subs 中调用 &main::E() 时有效,但在独立运行时这和 &main::C() 均失败。可能在定义 subs 之前的编译时间完成了独立调用。
顺便说一句,我尝试了 our 定义,但收到 502 错误:Nginx Debug Log
也许这是因为数组不可用?
【问题讨论】:
-
你是否也看过
my、our、local和state。我认为它与 perl 的范围机制有关,因为您的问题似乎根源于那里。 -
仅使用
$main::ARR{...}/%main::ARR将获得正确的变量(正如@mob 所建议的那样声明our %ARR;),但只有您能够判断XYZ 中的subs::最终在 C() 被调用之前被调用并且变量被设置为你所期望的。 -
建议(在文档中)不要使用 Perl 5.6 以上版本的
use vars。请改用our,或者最好使用my。 -
你说
&main::C()失败了?怎么样? -
@ysth 我在日志中收到 500 Internal Server Error 和
Undefined subroutine &main::C called at /path/to/file.pl line 123错误消息。
标签: perl