从 "BEGIN" Block/Package 访问 "external" Perl 数组
Access "external" Perl Array from "BEGIN" Block/Package
下面是我尝试修改的 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 ("requires explicit package name")
我试过,试图在块中复制一个类似的例子,$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() ;
请注意,对 &main::E()
的调用在 XYZ 包中的 Subs 中调用时有效,但当 运行 独立时,此调用和 &main::C()
均失败。也许在定义 subs 之前,独立调用是在编译时完成的。
顺便说一句,我尝试了 our
定义,但出现 502 错误:Nginx Debug Log
可能是因为数组不可用?
%main:ARR
或 $main::ARR{index}
对于您提供的代码框架是正确的(好吧,任何事情都是正确的,因为您没有说 use 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 脚本的简化版本:
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 ("requires explicit package name")
我试过,试图在块中复制一个类似的例子,$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() ;
请注意,对 &main::E()
的调用在 XYZ 包中的 Subs 中调用时有效,但当 运行 独立时,此调用和 &main::C()
均失败。也许在定义 subs 之前,独立调用是在编译时完成的。
顺便说一句,我尝试了 our
定义,但出现 502 错误:Nginx Debug Log
可能是因为数组不可用?
%main:ARR
或 $main::ARR{index}
对于您提供的代码框架是正确的(好吧,任何事情都是正确的,因为您没有说 use 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;
}
}
...