【问题标题】:Access "external" Perl Array from "BEGIN" Block/Package从“BEGIN”块/包访问“外部”Perl 数组
【发布时间】: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

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

【问题讨论】:

  • 你是否也看过myourlocalstate。我认为它与 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


【解决方案1】:

%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;
    }
}

...

【讨论】:

  • 这解决了问题。我得到的 502 错误是由于其他问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2017-04-11
  • 2012-03-24
  • 1970-01-01
相关资源
最近更新 更多