Schrift
[thread]7841[/thread]

Erweitern von @INC: Anfängerfrage (Seite 2)

Leser: 4


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
master
 2006-03-30 18:38
#64205 #64205
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
dazu habe ich auch eine (mir etwas peinliche) frage:

Ich möchte meine eigenen Module nicht in Perl/lib usw. laden,
sondern aus einem eigenen Verzeichnis oberhalb des Skirpts.

z.b. Dateisktruktur:
meinskript.pl
libs/meinmodul.pl

Wie erreicht man sowas?
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Linuxer
 2006-03-30 19:04
#64206 #64206
User since
2006-01-27
3874 Artikel
HausmeisterIn

user image
[quote=master,30.03.2006, 16:38]dazu habe ich auch eine (mir etwas peinliche) frage:

Ich möchte meine eigenen Module nicht in Perl/lib usw. laden,
sondern aus einem eigenen Verzeichnis oberhalb des Skirpts.

z.b. Dateisktruktur:
meinskript.pl
libs/meinmodul.pl

Wie erreicht man sowas?[/quote]
Module sollten auf .pm enden, nicht auf .pl.

Da i.d.R. der . zum @INC gehört, kannst Du Dein Modul beispielsweise mit
Code (perl): (dl )
use libs::mein_modul;

einbinden.

Voraussetzung ist, dass das Modul auch sauber so definiert wurde, also wenigstens mit
Code (perl): (dl )
package libs::mein_modul;

eingeleitet wird.


Struktur:
skript.pl
libs/mein_modul.pm


Beispiel fuer einen Modul-Skelett:
Code (perl): (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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Author
# Date
# Purpose

# rename package! 
#package modul_skel;
package libs::modul_skel;
use strict;
use Exporter;

# alle notwendigen Variablen, exportierbar oder auch nicht,
# muessen hier deklariert werden
use vars qw($VERSION @ISA @EXPORT $share);

$VERSION = '0.0.1';
@ISA = qw(Exporter);

# alle Objekte (Variablen, Funktionen), die auch exportiert werden sollen,
# muessen hier rein
@EXPORT = qw($share foo bar);

# Variablen
# ------------------------------------------------------------------------
#

$share = 'hello world';


# Sub-Routinen
# ------------------------------------------------------------------------
#

sub foo {
  # do foo
}

sub bar {
  # do bar
}

# Module muessen mit Status 1 beendet werden
1;

# vim: set ts=4 sw=2 et:


Modul Skelett ohne Gewähr da QuickHack.\n\n

<!--EDIT|Linuxer|1143731366-->
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!
master
 2006-03-30 19:18
#64207 #64207
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
DANKE linuxer... :-)
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Crian
 2006-03-30 19:24
#64208 #64208
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Eigene Module sollten mit einem Großbuchstaben beginnen. (Kleingeschribenes ist für Pragmas reserviert.)

Außerdem finde ich es bei der Struktur

Code: (dl )
1
2
3
meinskript.pl
modules/ModulEins.pm
modules/ModulZwei.pm


schöner, im Skript zu schreiben

Code: (dl )
1
2
3
4
5
6
7
...
use FindBin:
use lib $FindBin::Bin . '/modules';

use ModuleEins;
use ModulZwei;
...



Im Paket steht dann nicht von "modules", das gehört da meiner Meinung auch nicht rein.\n\n

<!--EDIT|Crian|1143732570-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
master
 2006-03-30 19:46
#64209 #64209
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
ok habe mein erstes objektorientiertes Modulgeschafft :-)

Anderes Thema und folgendes Problem:


Skript.pl
+ sub start {}
+ sub hilfe {}


im Skript.pl

hats einen include auf include "rechnen.pl"

rechnen.pl
+ sub start {}



skript.pl inkludiert also rechnen.pl ... bei beiden gibts eine sub "start" gibts die möglichkeit in einem includefile
eine sub nur für das include file selber gültig zu machen?

Oder ist es alternativ sinvoller objektorientiert zu entwicklen?
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-03-30 19:48
#64210 #64210
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@crain
Sauber! Genau das meine ich auch...
(aber schnallt das dann auch z. B. PAR ?)


Klappt wunderbar!

Hauptskript:
Code: (dl )
1
2
3
4
5
6
7
8
9
use FindBin qw($Bin); chdir($Bin);

use lib $FindBin::Bin . '/LIBS';
use X::Testmodul; #in zusätzlichen sub dir "X", daher X::

my $Testmodul = Testmodul->new();

$Testmodul->Modulprint();
print $Testmodul::wurst;



Modul:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

package Testmodul;
$wurst = 1;

sub new {
my $Objekt = shift;
my $Referenz = {};
bless($Referenz,$Objekt);
return($Referenz);
}

sub Modulprint {print "Hier meldet sich das Modul \"Modul.pm\"\n";}
sub get {return $wurst;}

1;




ps. kann man Module auch verschachteln ist sowas sinvoll?\n\n

<!--EDIT|master|1143734128-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Linuxer
 2006-03-30 20:11
#64211 #64211
User since
2006-01-27
3874 Artikel
HausmeisterIn

user image
[quote=Crian,30.03.2006, 17:24]Eigene Module sollten mit einem Großbuchstaben beginnen. (Kleingeschribenes ist für Pragmas reserviert.)[/quote]

Dann gilt diese Bedingung generell fuer Module und nicht nur fuer eigene ;o)

[quote=Crian,30.03.2006, 17:24]
Außerdem finde ich es bei der Struktur

Code: (dl )
1
2
3
meinskript.pl
modules/ModulEins.pm
modules/ModulZwei.pm


schöner, im Skript zu schreiben

Code: (dl )
1
2
3
4
5
6
7
...
use FindBin:
use lib $FindBin::Bin . '/modules';

use ModuleEins;
use ModulZwei;
...



Im Paket steht dann nicht von "modules", das gehört da meiner Meinung auch nicht rein.[/quote]

Kann ich nachvollziehen; macht hier auch Sinn.
Ich habe bisher lediglich in CGI-Skripten ein Modul erstellt, um dort wiederkehrend benoetigte Routinen abzulegen. Dieses Modul liegt aber parallel zu den CGI-Skripten, sodass ich mit den Pfaden und Modulnamen bisher keine Probleme hatte.

Sobald es eine aufwendigere Modul-Suite werden soll, macht das Sinn, das auch ins Paket aufzunehmen.
Dann sollte ich mir Gedanken machen, wie ich meine Module aufeinander aufbaue und wie ich sie im Verzeichnisbaum verwalte.
Aber soweit ist es hier ja noch nicht ;o)

[edit]Ich wollte es nur aufgreifen, die Ablage im Unterverzeichnis zu berücksichtigen. Und die Variante, das Unterverzeichnis via "use lib" einzubinden, hat sich mir bisher geschickt entzogen, sodass ich da nicht dran gedacht habe ;o( [/edit]\n\n

<!--EDIT|Linuxer|1143735246-->
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!
renee
 2006-03-31 10:09
#64212 #64212
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Linuxer,30.03.2006, 17:04][...]
Beispiel fuer einen Modul-Skelett:
Code (perl): (dl )
1
2
3
4
5
6
7
# Author
# Date
# Purpose

# rename package! 
#package modul_skel;
package libs::modul_skel;

[...][/quote]
Für das erstellen von Modulen ist vielleicht auch der Wiki:Artikel ganz nützlich.
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/
pq
 2006-03-31 12:56
#64213 #64213
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Linuxer,30.03.2006, 17:04]Beispiel fuer einen Modul-Skelett:
Code (perl): (dl )
1
2
3
4
use strict;
use Exporter;
[...]
@ISA = qw(Exporter);
[/quote]
1. use warnings fehlt
2. das base-modul ist jetzt fast 8 jahre alt, man darf es also auch gerne benutzen: use base qw(Exporter);
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Linuxer
 2006-03-31 13:48
#64214 #64214
User since
2006-01-27
3874 Artikel
HausmeisterIn

user image
[quote=pq,31.03.2006, 10:56][quote=Linuxer,30.03.2006, 17:04]Beispiel fuer einen Modul-Skelett:
Code (perl): (dl )
1
2
3
4
use strict;
use Exporter;
[...]
@ISA = qw(Exporter);
[/quote]
1. use warnings fehlt
2. das base-modul ist jetzt fast 8 jahre alt, man darf es also auch gerne benutzen: use base qw(Exporter);[/quote]
1. stimmt. Keine Ahnung, warum es nicht den Weg in dieses Modul-Skelett gefunden hat.

2. base ist mir bis heute unbekannt und wurde iirc auch nicht in
perldoc perlmod erwähnt... Und dieses war die Grundlage fuer das Skelett.
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!
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2006-03-30 17:10.