首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未定义子例程&PDL::divide

未定义子例程&PDL::divide
EN

Stack Overflow用户
提问于 2014-07-01 00:32:56
回答 3查看 298关注 0票数 3

我在下面的代码中尝试使用Perl的PDL:

代码语言:javascript
复制
#!/usr/bin/perl  -w
use strict;
use PDL::Core qw(pdl);
use PDL::Math qw(isfinite);
use PDL::Primitive qw(statsover);


my $div = 4;
my @array1 = (0..10);
my $pdl_array = log(pdl(@array1)/$div);
$pdl_array->where(!isfinite($pdl_array)) .= 0;
my($mean,$stdev) = statsover($pdl_array);
die $pdl_array,"\n",$mean," ",$stdev,"\n";

我得到了这个错误:

未定义的子例程&PDL::divide在./compare_const.pl第10行调用。

有什么提示吗?非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2014-07-03 20:40:34

PDL在设计上是不同寻常的,因此有一个不同寻常且有些脆弱的导入机制。每个PDL模块都通过inserting a new method directly into PDL's package为PDL添加了功能。这一决定是在PDL v2设计的非常早的时候做出的,并且在其间的十年中没有改变。(没有理由不能更改它,即使是以向后兼容的方式,但没有一个PDL开发人员留出时间这样做。)

因此,您必须加载一些模块,以确保PDL具有其必需的基本功能。如果查看一下PDL导入函数,就会注意到it explicitly loads a number of packages into the caller's namespace。这样做的原因是好的-将功能拆分到多个模块,以保持分发的合理性-但实现并不符合常见的Perl实践。这就是您尝试将特定函数导入命名空间失败的原因。

解决方案已经解释过了。或者用一个use PDL替换所有的use PDL::...语句

代码语言:javascript
复制
use strict;
use warnings;
use PDL;

my $div = 4;
...

或者使用use PDL::Lite (以确保PDL包是完整的),然后将特定函数导入(主)包

代码语言:javascript
复制
use strict;
use warnings;

use PDL::Lite;
use PDL::Core qw(pdl);
use PDL::Math qw(isfinite);
use PDL::Primitive qw(statsover);

my $div = 4;
...
票数 4
EN

Stack Overflow用户

发布于 2014-07-01 00:56:29

PDL有一个必须加载的东西的最小集合。要正确加载所有这些内容,您必须使用use PDL (它还会导出大量内容)或use PDL::Lite

(出于某种原因,我认为您显式地直接调用了PDL::divide并得到了该错误,因此我的原始答案如下。)

原始答案:

我想知道为什么你认为这应该行得通?

是的,PDL导出了一堆东西(如果你使用它,但你不使用它),但这不能保证它从哪里导出它。(实际上,它似乎是从许多不同的地方直接导出到正在使用的包中。)

如果您试图避免名称空间污染,我建议您要么导入到指定的包中,然后使用其中的内容:

代码语言:javascript
复制
{
    package My::PDL;
    use PDL;
}
...
My::PDL::divide...

或者使用OO接口(我想,请参阅PDL::Lite?)

票数 1
EN

Stack Overflow用户

发布于 2014-07-01 04:52:43

只需添加use PDL;,您的代码就会正常工作:

代码语言:javascript
复制
#!/usr/bin/perl  -w
use strict;

use PDL;
use PDL::Core qw(pdl);
use PDL::Math qw(isfinite);
use PDL::Primitive qw(statsover);

my $div = 4;
my @array1 = (0..10);
my $pdl_array = log( pdl(@array1) / $div );
$pdl_array->where(!isfinite($pdl_array)) .= 0;
my ($mean, $stdev) = statsover($pdl_array);
die $pdl_array, "\n", $mean, " ", $stdev, "\n";

输出:

代码语言:javascript
复制
[0 -1.3862944 -0.69314718 -0.28768207 0 0.22314355 0.40546511 0.55961579 0.69314718 0.81093022 0.91629073]
0.112860814716055 0.696414187766251
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24494845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档