6 Stimmen

Perl-Modul-Fehler bezüglich "undefinierter Unterroutine"

Ich versuche, ein Modul namens Math::Zählen :

#!/usr/bin/perl 

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

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

Wenn ich es jedoch ausführe, erhalte ich die folgende Fehlermeldung

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

Es scheint, dass die Funktion factorial wird nicht exportiert, aber warum?

Wenn ich das Folgende verwendet habe

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

anstelle des obigen Beispiels funktioniert es einwandfrei, aber ich bin neugierig, warum die Funktion nicht exportiert werden kann.

Ich verwende perl v5.10.1 auf Cygwin.

7voto

Sinan Ünür Punkte 114993

Math::Zählen sieht ein wenig albern aus (ich meine Studenten gegen Technik Modi?) Die real Faktorielle Funktion, die vom Modul bereitgestellt wird, bfact ist eine dünne Hülle um Math::BigInt::bfac . Verwenden Sie also einfach Math::BigInt .

#!/usr/bin/env perl

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

print Math::BigInt->bfac('300'), "\n";

Ausgabe:

30605751221644063603537046129726862938858880417357699941677674125947653317671686
74655152914224775733499391478887017263688642639077590031542268429279069745598412
25476930271954604008012215776252176854255965356903506788725264321896264299365204
57644883038890975394348962543605322598077652127082243763944912012867867536830571
22936819436499564604981664502277165001851765464693401122260347297240663332585835
06870150169794168850353752137554910289126407157154830282284937952636580145235233
15693648223343679925459409527682060806223281238738388081704960000000000000000000
0000000000000000000000000000000000000000000000000000000

Nein , Ich habe das Ergebnis nicht verifiziert .

Wie andere bereits festgestellt haben, Math::Counting hat:

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

aber es gibt keine require Ausführer .

Tatsächlich ist es nicht erforderlich, dass dieses Modul erben vom Exporteur. Eine einfache:

use Exporter 'import'; 

wäre ausreichend gewesen. Außerdem gibt es wirklich keinen Grund, den Namespace eines Benutzers dieses Moduls standardmäßig zu verschmutzen, also sollte es reichen:

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

Wozu sonst die Definition von %EXPORT_TAGS ?

7voto

pilcrow Punkte 53851

Es gibt einen Fehler im Modul. Math::Zählen ISA Ausführer aber Math::Counting lädt nicht Exporter .

Umgehung: Sie können erfordern o verwenden. Exporter manuell.

Besser: Melden Sie dem Modulautor einen Fehler, stellen Sie einen Testfall zur Verfügung.

Kommentar:

Oh, sehr interessant. Der Modulautor testet zwar seine Funktionen, aber Test::More holt ein Exporter was bedeutet, dass diese Auslassung in der Modulquelle nicht bemerkt wurde.

Aktualisierung:

Math::Zählen 0.0904 wurde veröffentlicht und behebt dieses Problem.

2voto

beresfordt Punkte 4964

Es scheint, dass Math::Zählen fehlt require Exporter; so dass keine seiner Funktionen in Ihren Namespace exportiert wird.

2voto

Gene Punkte 141

Nachdem ich von einer netten Person darauf aufmerksam gemacht wurde, die bei CPAN einen Fehlerbericht über meine vergessene require-Anweisung eingereicht hat, habe ich den Modulexport korrigiert, einschließlich des Kommentars über die "Verschmutzung des Namensraums".

Außerdem habe ich einen Hinweis hinzugefügt, dass es sich um eine "dünne Hülle" für Math::BigInt->bfac() für reale Anwendungen, in den Unterlagen. Als ich es erstellte, konnte ich keine einfachen Berechnungen für Permutation oder Kombination finden. Jetzt gibt es eine Fülle von...

0voto

Konerak Punkte 38232

Es scheint, dass das Math::Counting-Modul die faktorielle Methode nicht exportiert hat, als Sie es mit use Math::Counting .

Die CPAN-Seite hat folgende Aufgaben

use Math::Counting ':student';

und anschließend wird die faktorielle Methode in Ihren Namespace exportiert, und Sie können sie verwenden, ohne den gesamten Paketnamen voranzustellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X