【问题标题】:export pdl() only from perl PDL仅从 perl PDL 导出 pdl()
【发布时间】:2012-02-19 03:21:31
【问题描述】:

我只想从PDL 导出pdl() 函数,以避免与其他自动导出的函数(例如maxmediansumintersect 等)发生命名空间冲突。但是,当我尝试

use PDL qw(pdl);

它不起作用,因为上述函数仍会被导出(并且我会收到有关重新定义函数的警告)。

另一方面,如果我这样做了

use PDL qw();

没有发生碰撞。但是当我尝试通过PDL::pdl()在程序中使用pdl()函数时,它会失败并显示以下错误消息:

Can't call method "new" on unblessed reference at Basic/Core/Core.pm.PL (i.e. PDL::Core.pm) line 934.

另外,我在脚本里面试过

{
     require PDL;
     pdl();
}

我收到相同的错误消息。

有人可以建议我如何仅导出 pdl() 吗?谢谢!

【问题讨论】:

    标签: perl export pdl


    【解决方案1】:

    use PDL qw() 所做的与use PDL 不同的事情实际上让我有点惊讶。事实上,我不明白它是怎么做到的:PDL::import 的代码不关注它的参数。为此目的创建了一个不同的模块,称为PDL::Lite,相当于:

    use PDL::Core '';
    use PDL::Ops '';
    use PDL::Primitive '';
    use PDL::Ufunc '';
    use PDL::Basic '';
    use PDL::Slices '';
    use PDL::Bad '';
    use PDL::Version;
    use PDL::Lvalue;
    

    通常use PDL 中的一些附加功能被删除,并且没有导入任何功能。 (PDL::LvaluePDL::Version 不导出任何内容。)

    关于第二个问题,当您 use PDL::Lite 时,您仍然可以使用 PDL->pdl(1, 2, 3) 访问 pdl 构造函数。你不能说PDL::pdl(1, 2, 3),因为构造函数实际上是在PDL::Core 包中定义的。去搞清楚。所以,PDL::Core::pdl(1, 2, 3) 符合您的意思,但不是显而易见的选择。

    【讨论】:

      【解决方案2】:

      概要 使用 PDL; # 等价于:

         use PDL::Core;
         use PDL::Ops;
         use PDL::Primitive;
         use PDL::Ufunc;
         use PDL::Basic;
         use PDL::Slices;
         use PDL::Bad;
         use PDL::MatrixOps;
         use PDL::Math;
         use PDL::Version;
         use PDL::IO::Misc;
         use PDL::IO::FITS;
         use PDL::IO::Pic;
         use PDL::Lvalue;
      

      我猜如果你只导入 PDL::Core,你只会得到这个模块中的函数。

      【讨论】:

      • 不,不要只导入 PDL::Core。其中许多模块假定其他模块已加载,因此您必须使用use PDL 拉入整个模块。
      猜你喜欢
      • 2017-09-06
      • 2016-09-16
      • 1970-01-01
      • 2022-08-10
      • 2020-06-16
      • 2014-02-21
      • 2012-01-24
      • 2015-09-11
      • 2019-07-13
      相关资源
      最近更新 更多