【问题标题】:Package name in module code模块代码中的包名
【发布时间】:2013-01-07 10:16:56
【问题描述】:

短版

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

示例

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";

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

动机

我之所以问这个问题是因为我在最近升级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 块中,$engine 设置正确,但$Foswiki::engine 显然不是。所以看起来这里有两个变量,一个是合格的,一个是不合格的。

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

【问题讨论】:

    标签: perl variables package scope perl-module


    【解决方案1】:

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

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

    【讨论】:

    • 好的,关于上游源代码中存在该行是正确的。我错误地认为我的本地副本是相同的。仍在试图找出那条线在我的副本中的位置。奇怪,但绝对是本地问题。
    猜你喜欢
    • 2023-03-20
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2021-12-31
    • 1970-01-01
    • 2022-10-18
    • 2020-10-13
    相关资源
    最近更新 更多