gpt4 book ai didi

perl - 未定义的子程序 &PDL::divide

转载 作者:行者123 更新时间:2023-12-01 10:47:14 26 4
gpt4 key购买 nike

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

#!/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";

我收到了这个错误:

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

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

最佳答案

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:

use strict;
use warnings;
use PDL;

my $div = 4;
...

或者说使用 PDL::Lite(以确保 PDL 的包是完整的),然后将特定功能导入到您的(主)包中

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

关于perl - 未定义的子程序 &PDL::divide,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24494845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com