【问题标题】:How do I predeclare a package in Perl?如何在 Perl 中预先声明一个包?
【发布时间】:2019-10-08 20:15:39
【问题描述】:

我正在尝试删除一条警告消息,在perldiag 中有以下解释:

Bareword "%s" refers to nonexistent package (W bareword) 您使用了“Foo::”形式的限定裸词,但在此之前编译器没有看到该命名空间的其他用途。也许您需要预先声明一个包?

(问题是我有一个子程序将一个对象祝福到一个稍后声明的包中)

我想通过“预先声明”包来遵循手册页中的建议,但我不知道该怎么做。在 Perl 中预先声明一个包的语法是什么?

【问题讨论】:

  • 您能否提供一个失败代码的简短工作示例,用于测试?
  • 我不知道如何做到这一点,perl -Mstrict -wE'sub tt { return bless { one=>1 }, "PackName" }; my $obj = tt(); say ref $obj' 正确打印PackName。否则,我想BEGIN { package PackName {}; } 应该介绍它...
  • @zdim package 显然有编译时效果,所以不需要BEGIN
  • @ikegami 嘿,对。通过在一个单元(和一个单行)中测试(这里是不相关的问题)而误入歧途

标签: perl package


【解决方案1】:

Foo::'Foo' 相同,只是它会在包不存在时发出警告。

您可以通过创建包来消除警告。以下两个语句都实现了这一点:

{ package Foo; }

package Foo { }   # 5.14+

但这很不合时宜。如果您只是要无视检查,为什么要使用执行包检查的语法?使用以下内容会更好:

my $self = bless({}, 'Foo');

另一种选择是

no warnings qw( bareword );
my $self = bless({}, Foo::);

这向读者表明你知道你正在使用一个还不存在的包。

【讨论】:

    【解决方案2】:

    你的问题不是预先声明包(你可以通过简单地在一个范围内声明包来做到这一点),但是那个 bless 只需要一个字符串,你不需要使用不常见的裸字语法Foo::创建它(从而触发警告)。

    bless $obj, 'Foo';
    

    【讨论】:

    • 您可能会认为我正在描述与您最近的帖子中相同的(人类|解析器)标记化:stackoverflow.com/questions/58263206/…
    • 我相信基于它在文档和社区中的使用对裸字的更精确定义将只是“未引用的标识符”。 “bareword filehandles”是更常见的示例之一,或者是 require/use 采用的裸词而不是字符串。
    • "identifier" 暗示它是一个名称或某种其他类型的标识符。 “未引用的词”是我在上述问题中使用的。我将全部用于这个更一般的用途,因为它真的没有任何其他词。
    • 'identifier' 实际上也是此处定义的一个特定术语:perldoc.pl/perldata#Identifier-parsing - 是否将印记视为标识符的一部分有点模糊,但相同的语法适用于其中许多情况.
    • 我对标识符的看法与对文件名的看法相同。有时他们是合格的,有时他们不是,这个名字可以用于任何一个。
    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多