【问题标题】:Perl - Call subroutine of main namespace from packagePerl - 从包中调用主命名空间的子例程
【发布时间】:2018-09-21 01:53:19
【问题描述】:

program.pl

Use Mypackage;

sub test{

print "from test";

}

Mypackage.pl

Package Mypackage;

::test();

这不返回任何内容。

我从包中看到几个关于在命名空间中调用子例程的线程,但我想做相反

从主命名空间(program.pl)打印包中的子例程

这可能吗?

【问题讨论】:

  • 尝试将BEGIN {} 放在子def 周围并将其移到use Mypackage 语句之前
  • 您的包裹声明错误。 Perl 的关键字区分大小写。这是package,而不是Package
  • @Hakon,我得到:未定义的子例程 &main::test 不起作用。
  • 另外,use 应该是小写,Mypackage 应该有扩展名pm,而不是pl
  • @Thenothing 好的,请更新问题并显示新代码。它对我有用。

标签: perl namespaces package subroutine


【解决方案1】:

声明use Mypackageequivalent to

BEGIN { require Mypackage; Mypackage->import( ); }

所以我们看到Mypackage 在执行主程序之前执行(因为它在BEGIN 块中)。有关更多信息,请参阅this 答案,这是另一个示例。因此,此时尚未定义主程序中的子test()。为了让它发挥作用,我们 需要在运行Mypackage 时定义它。一种方法是 将其放在主程序中use Mypackage 语句之前的BEGIN 块中。

BEGIN {
    sub test{
        print "from test\n";
    }
}    
use Mypackage;

【讨论】:

  • 非常感谢您的帮助,这可能以 OOP 的形式进行吗?我想以 OO 的语法调用子程序。
  • @Thenothing 对于面向对象的调用,您需要一个对象来调用您的方法。在这个上下文中没有对象,你的 main 命名空间通常不会是一个类。
  • @Hakon,对不起,但这种方法不适用于 plackup program.psgi 但如果使用 perl program.psgi,在 plack 我得到未定义的子例程 &main::test
  • @Thenothing 对不起,我不熟悉 plackup。也许您应该发布一个新问题,显示您正在使用的特定代码?
猜你喜欢
  • 1970-01-01
  • 2014-07-06
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2014-01-15
相关资源
最近更新 更多