6

Math::Countingというモジュールを使用しようとしています:

#!/usr/bin/perl 

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

my $f = factorial(3);
print "$f\n";

ただし、実行すると、次のエラーが表示されます

$ perl UsingModules.pl
Undefined subroutine &main::factorial called at UsingModules.pl line 8.

関数factorialがエクスポートされていないようですが、なぜですか?

以下を使用したとき

my $f = Math::Counting::factorial(3);

上記の代わりに、それは完全に正常に機能しますが、関数をエクスポートできない理由が知りたいです。

perlCygwin で v5.10.1 を使用しています。

4

6 に答える 6

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

出力:

30605751221644063603537046129726862938858880417357699941677674125947653317671686
74655152914224775733499391478887017263688642639077590031542268429279069745598412
25476930271954604008012215776252176854255965356903506788725264321896264299365204
57644883038890975394348962543605322598077652127082243763944912012867867536830571
22936819436499564604981664502277165001851765464693401122260347297240663332585835
06870150169794168850353752137554910289126407157154830282284937952636580145235233
15693648223343679925459409527682060806223281238738388081704960000000000000000000
0000000000000000000000000000000000000000000000000000000

いいえ結果を確認しませんでした。

他の人が指摘しているように、Math::Counting持っています:

our @ISA = qw(Exporter);
our @EXPORT = qw(
    factorial permutation combination
    bfact     bperm       bcomb
);

require しかし、エクスポーターはありません。

実際、このモジュールをExporterから継承する必要はありません。シンプルな:

use Exporter 'import'; 

十分だっただろう。また、デフォルトでは、このモジュールのユーザーの名前空間を汚染する必要はないため、次のようにする必要があります。

our @EXPORT = ();
our @EXPORT_OK = qw(
    factorial permutation combination
    bfact     bperm       bcomb
);

そうでなければ、定義のポイントは何%EXPORT_TAGSですか?

于 2012-04-25T15:13:22.530 に答える
7

モジュールにバグがあります。Math :: Counting ISA Exporterですが、Math::CountingロードされませんExporter

回避策:手動で要求または使用 Exporterできます。

より良い方法:モジュールの作成者にバグを報告し、テストケースを提供します。

コメント:

ああ、とても面白い。モジュールの作成者は自分の機能をテストしますが、Test::MoreプルインしExporterます。つまり、モジュールソースからのこの省略は気付かれませんでした。

アップデート:

Math :: Counting 0.0904がリリースされ、この問題に対処しています。

于 2012-04-25T15:29:03.820 に答える
2

Math::Countingが欠落しているように見えるrequire Exporter;ため、その関数は名前空間にエクスポートされていません。

于 2012-04-25T15:26:33.110 に答える
2

私の忘れていたrequireステートメントに関してCPANにバグレポートを提出した親切な人から警告を受けた後、「名前空間を汚染している」というコメントを含めて、モジュールのエクスポートを修正しました。

Math::BigInt->bfac()また、ドキュメントに、実際のアプリケーション用の「薄いラッパー」であるというメモを追加しました。作ってみると、順列や組み合わせの簡単な計算が見当たりませんでした。今ではたくさんあります...

于 2012-04-26T15:45:33.300 に答える
0

Math::Counting のソース コードを見て、そのバージョンを確認してください。これを行うことで、ソースがどこにあるかを見つけることができます:

prompt> perldoc -l Math::Counting

また、モジュールの$VERSION変数を調べることで、約 90% の確率でモジュールのバージョンを見つけることができます。

use Math::Dumper;
print "The version of Math::Dumper is $Math::Dumper::VERSION\n";

バージョン 0.0902 をダウンロードしたところ、次のプログラムは問題なく動作します。

#! /usr/bin/env perl
#
use strict;
use warnings;
use feature qw(say);

use Math::Counting;

say $Math::Counting::VERSION;
say factorial(6);

私はこのバージョンで、彼が持っていることに気づきました:

our @ISA = qw(Exporter);
our @EXPORT = qw(
    factorial permutation combination
    bfact     bperm       bcomb
);

そのため、作成者はこの特定のバージョンですべてのサブルーチンを自動的にエクスポートしているようです。:student作成者は、定義されたエクスポート タグの 2 つのグループも持っていますbig

@EXPORTそれは以前のバージョンにある可能性があり、彼は定義していませんでしたが、使用@EXPORT_OKしていました (これが望ましいです)。これを行う必要がありました。

use Match::Counting qw(:student);

また

use Math::Counting qw(factorial);
于 2012-04-25T15:58:13.283 に答える
0

Math::Counting モジュールは、 を使用して呼び出したときに階乗法をエクスポートしなかったようですuse Math::Counting

CPAN ページは次のことを行います。

use Math::Counting ':student';

その後、階乗法が名前空間にエクスポートされ、パッケージ名全体を前に付けなくても使用できます。

于 2012-04-25T15:05:21.633 に答える