Schrift
[thread]11985[/thread]

Module einbinden

Leser: 4


<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
Gast Gast
 2008-06-06 13:21
#110806 #110806
Hi!

Wo hängt es hier:

/home/mm/perl/prime.pm
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#! /usr/bin/perl -w
use strict;

package prime;
require Exporter;
our @ISA = qw(Exporter);
our @Export = qw(is_prime);
our $Version = 1.00;

sub is_prime {
        return 0 if int( $_[0] ) != $_[0];
        return 0 if $_[0] == 1;
        return 0 if $_[0] % 2 == 0 && $_[0] != 2;
   my $limit = int( sqrt( $_[0] ) ) + 1;
        for ( my $l = 3; $l <= $limit; $l += 2 ) {
                return 0 if $_[0] % $l == 0;
        }
        return 1;
}
1;


Wenn ich veruche, die Subroutine "is_prime" so aufzurufen

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
#! /usr/bin/perl -w
use strict;
use lib '/home/mm/perl/';
use prime;



foreach my $n ( 2..20 ) {
        print "$n ist eine Primzahl\n" if is_prime( $n );
}

bekomme ich diese Fehlermeldung: "Undefined subroutine &main::is_prime called at ./test.pl line 9."
Mit "print "$n ist eine Primzahl\n" if prime::is_prime( $n );" funktioniert es.
renee
 2008-06-06 13:38
#110807 #110807
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ersetze @Export durch @EXPORT!

Kleine Anmerkung: Eigene Module sollten nicht komplett kleingeschrieben werden, sondern mit einem Großbuchstaben anfangen. Namen mit Kleinbuchstaben sind eigentlich für Pragmas (wie strict und warnings) gedacht...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
moritz
 2008-06-06 13:40
#110808 #110808
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Du musst @EXPORT anstatt @Export verwenden.
Gast Gast
 2008-06-06 14:06
#110809 #110809
Hallo! Ich habe das selbe Problem, aber @EXPORT geschrieben.
Lib.pm
Code (perl): (dl )
1
2
3
4
5
6
7
package testdir::Lib;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(printv dateTime);
use strict;
[funktionen]
1;


Ich kann die Funktionen aber nur per
Code (perl): (dl )
testdir::Libs->func()
aufrufen. Was kann ich machen, dass ich die Funktion einfach mit
Code (perl): (dl )
func()
aufrufen kann?
moritz
 2008-06-06 14:23
#110810 #110810
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Also ein guter Anfang wäre schon mal, konsequent 'Lib' oder 'Libs' zu benutzen, und zwar nur eines davon ;)
Gast Gast
 2008-06-06 14:31
#110811 #110811
stimmt! :-) Aber das ändert leider nichts am Problem :-(
Linuxer
 2008-06-06 14:33
#110812 #110812
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Ein zweiter Schritt wäre, zu verraten, wie das selbst geschrieben Modul denn im Hauptskript eingebunden wird.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
moritz
 2008-06-06 14:36
#110813 #110813
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Und der dritte Schritt wäre ein komplettes, reduziertes Beispiel, das wir selbst ausführen können um damit herumzuspielen.
Linuxer
 2008-06-06 14:57
#110816 #110816
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
folgender Code auf Basis der perlmod funktioniert bei mir (--8<-- gehört *nicht* zum Code, sondern ist Trenner):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Datei MyTest.pm:
--8<--
package MyTest;

use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS );
use Exporter;
push @ISA, qw( Exporter );
@EXPORT = qw( foobar );

sub foobar {
print "Hello World!\n";
}

1;

--8<--

Datei mytest.pl:
--8<--
#!/usr/bin/perl
use strict;
use warnings;
use MyTest;

foobar();

--8<--


Schau ich mir Dein Beispiel an, kann das nicht funktionieren.
Zum einen besteht ein Unterschied zwischen Lib und Libs, und ausserdem exportierst Du printv und dateTime und rufst anschliessend func auf...
Wie soll das funktionieren?

[edit]wg. Hektik mehrere Aenderungen am Code und Text[/edit]
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Gast Gast
 2008-06-06 15:07
#110818 #110818
okay. Also Lib.pm liegt in c:\Perl\lib\testdir
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
package testdir::Lib;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORTER = qw(printv);
use strict;

sub printv {
        my $key = shift;
        return $key;
}
1;


und mein skript schaut so aus:
Code (perl): (dl )
1
2
3
4
5
6
use warnings;
use strict;
use testdir::Lib;

printv("test");
testdir::Lib->printv("Test");
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2008-06-06 13:21.