gpt4 book ai didi

perl - 模块代码中的包名

转载 作者:行者123 更新时间:2023-12-04 05:16:33 24 4
gpt4 key购买 nike

简洁版本

是否可以从声明为 our 的模块中访问变量?在 BEGIN 中使用非限定名称代码块,但在外面使用限定名称?特别是,这可以在不明确命名模块文件中的包的情况下完成吗?

例子

demomod.pm

use strict;
use warnings;
package demomod;
our $foo;
BEGIN { $foo = 42; }
1;

demoscript.pl
#!/usr/bin/perl -Tw
use strict;
use warnings;
BEGIN { @INC = ('.', @INC); }
use demomod;
print $demomod::foo."\n";

在这种情况下,所有名称都同意,并且一切正常。有没有办法省略 package demomod; 行来自 demomod.pm代码,仍然让这个工作?

动机

我问的原因是因为我在最近升级 Foswiki 时遇到了类似的情况。 .该软件有一个模块 Foswiki.pm 没有 package行(编辑:似乎 package 行仅在我的本地副本中丢失,原因不明)。它 declaresinitializes一个变量 $engine就像我的例子一样。还有一个名为 view 的 CGI 脚本设置 @INC然后 use Foswiki ();后跟 $Foswiki::engine->run() .由于变量未初始化,最后一行对我来说总是失败:

Can't call method "run" on an undefined value at …/view

BEGIN模块 block , $engine设置正确,但 $Foswiki::engine显然不是。所以看起来这里有两个变量,一个是合格的,一个是不合格的。

所有这些代码显然都适用于其他人,以前的版本也适用于我,没有 package也行。因此,当我试图了解它是如何破坏的时,我也试图了解它以前是如何工作的,没有那条线。是否有某种机制可以使这项工作发挥作用?

最佳答案

如果您没有package在您的代码中声明,那么任何包变量都将被声明到 main包裹。所以不,你不能做你描述的事情。

如果您查看 Foswiki 的第 2 行你链接的代码,你会看到它确实有一个包语句。

关于perl - 模块代码中的包名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14193837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com