关于"未定义子例程"的Perl模块错误

Alb*_*lby 6 perl cygwin module

我正在尝试使用名为Math :: Counting的模块:

#!/usr/bin/perl 

use strict;
use warnings;
use Math::Counting;

my $f = factorial(3);
print "$f\n";
Run Code Online (Sandbox Code Playgroud)

然而,当我运行它时,我收到以下错误

$ perl UsingModules.pl
Undefined subroutine &main::factorial called at UsingModules.pl line 8.
Run Code Online (Sandbox Code Playgroud)

似乎功能factorial没有被导出,但为什么呢?

当我使用以下内容时

my $f = Math::Counting::factorial(3);
Run Code Online (Sandbox Code Playgroud)

而不是上面的,它完全正常,但我很好奇为什么功能无法导出.

perl在Cygwin上使用v5.10.1.

Sin*_*nür 7

Math :: Counting看起来有点傻(我的意思是学生工程模式?)模块提供的实际因子函数bfact是一个很薄的包装器Math::BigInt::bfac.所以,只需使用Math :: BigInt.

#!/usr/bin/env perl

use strict; use warnings;
use Math::BigInt();

print Math::BigInt->bfac('300'), "\n";
Run Code Online (Sandbox Code Playgroud)

输出:

30605751221644063603537046129726862938858880417357699941677674125947653317671686
74655152914224775733499391478887017263688642639077590031542268429279069745598412
25476930271954604008012215776252176854255965356903506788725264321896264299365204
57644883038890975394348962543605322598077652127082243763944912012867867536830571
22936819436499564604981664502277165001851765464693401122260347297240663332585835
06870150169794168850353752137554910289126407157154830282284937952636580145235233
15693648223343679925459409527682060806223281238738388081704960000000000000000000
0000000000000000000000000000000000000000000000000000000

,我没有验证结果.

正如其他人所说,Math::Counting有:

our @ISA = qw(Exporter);
our @EXPORT = qw(
    factorial permutation combination
    bfact     bperm       bcomb
);
Run Code Online (Sandbox Code Playgroud)

但没有require 出口商.

实际上,此模块不需要从Exporter 继承.一个简单的:

use Exporter 'import'; 
Run Code Online (Sandbox Code Playgroud)

本来就够了.此外,默认情况下确实不需要污染此模块的用户的命名空间,因此它应该具有:

our @EXPORT = ();
our @EXPORT_OK = qw(
    factorial permutation combination
    bfact     bperm       bcomb
);
Run Code Online (Sandbox Code Playgroud)

否则,定义的重点是%EXPORT_TAGS什么?


pil*_*row 7

模块中有一个错误.Math :: Counting ISA Exporter,但Math::Counting不加载Exporter.

解决方法:您可以手动要求使用 Exporter.

更好:向模块作者提交错误,提供测试用例.

评论:

哦,非常有趣.模块作者确实测试了他的功能,但是Test::More进入Exporter,意味着没有注意到模块源的这种遗漏.

更新:

Math :: Counting 0.0904已经发布,解决了这个问题.

  • @Sinan,谢谢你的格式和HREF.我在Test :: Simple/Test :: More下提交了一个bug.在我看来,套件不应该引入某些核心模块,正是出于这个原因. (3认同)