Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12986[/thread]

Werte in Subroutine und zurück mit Modulen



<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten
Brenner
 2009-01-13 17:30
#117906 #117906
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Hallo Community,

ich bin blutiger Anfänger, muss aber nun jeden Tag mit Perl arbeiten und (für mich) komplexe Sachen erstellen. Da ich teilweise, trotz etlicher Tutorials, nicht weiter komme muss ich jetzt hier mal fragen, auch wenn es für euch wahrscheinlich sehr simpel ist.


Ich habe in einem Modul in einer Subroutine ein array mit Werten aus einer Datei gefüllt.
In der Routine selber kann ich diese dann auch ausgeben lassen mit z.B.

print "Fehlernummer: ".$errormaplist[2];


Ausgabe ist dann z.B. ""Fehlernummer: 002 Datei nicht gefunden""

Ich will aber nun im Hauptprogramm die Fehlernummer in die Subroutine übergeben und dann die spzifische Meldung zurück bekommen. D.h. die "[2]" aus dem Beispiel müsste ich doch als Variable definieren die ihre Werte aus dem Hauptprogramm bekommt, aber das klappt irgendwie alles nicht.


Zusätzlich soll das dann noch alles objektorienttiert programmiert werden, aber mir würde schon eine "normale" Lösung für den Anfang reichen.
FoolAck
 2009-01-13 17:44
#117908 #117908
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Mal soweit wie ich das Verstanden hab: (etwas code wäre nicht verkehrt..)
Code: (dl )
1
2
3
4
5
6
7
8
9
use warnings; use strict;
sub foo {
my ($par) = @_;
my @arr = qw/ in seinen Armen das Kind war Brot /;
return $arr[$par];
}

print foo(3); # gibt "das" aus.
print foo(6); # gibt "Brot" aus.


Wäre die Subroutine in einem Modul würde das auch nicht anders ablaufen. (Bis auf das implizit übergebene $object als erster Parameter.)
pq
 2009-01-13 17:46
#117909 #117909
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wo ist denn genau das problem?
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
# modul
sub foo {
    my ($num) = @_;
    my @array = fuelle array...;
    print "Fehlernummer: $array[$num]\n";
}

# script
foo(23);


schon Wiki:perlsub gelesen?
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
Brenner
 2009-01-14 10:50
#117920 #117920
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Hallo und danke für die Mühe. Ich erkläre es doch mal ausführlicher.


Ich habe drei Dateien.
-errormap.txt
-errorhandling.pl
-test.pm

Die errormap.txt ist so gefüllt:
Code: (dl )
1
2
3
00 Fehlermeldung 00
01 Fehlermeldung 01
02 Fehlermeldung 02

und so weiter.


Die test.pm sieht bisher so aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package test;

use strict;
use warnings;
use IPC::Open2;


sub errormap
{
        my $errormaplist=shift;
        #print $errormaplist."\n";
        open (DATEI, "errormap.txt");
        @errormaplist=<DATEI>;
        close (DATEI);
}
1;


Hier habe ich versucht das array mit den Daten der Tabelle zu befüllen was auch klappt wenn man das array ausgibt.



Tja und in der errorhandling.pl ist noch nicht viel bis auf viele Zeilen Tests diverser Versuche die inzwischen auskommentiert sind.:

Code (perl): (dl )
1
2
3
4
5
6
#! /usr/bin/perl

use strict;
use warnings;

use <PfadzumModul>::test;






Ich möchte in der *.pl z.B.

print "Gib mir die Fehlernummer: ";
chomp($text = <STDIN>;

und dann eben irgendwie diese Fehlernummer ausgegeben haben die ich im Array in der *.pm eingelesen habe.


Vielleicht ist das von mir auch ein völlig falscher Ansatz, aber ich soll das ganze möglichst modular mit schlanken Hauptprogramm aufbauen, dazu noch objektorientiert.
Linuxer
 2009-01-14 11:46
#117921 #117921
User since
2006-01-27
3871 Artikel
HausmeisterIn

user image
Hi,

Einführungen zur OO:
http://perldoc.perl.org/perlboot.html
http://perldoc.perl.org/perltoot.html

Dann meine Anmerkungen:

- 'test' sollte als reserviertes Wort betrachtet werden und niemals so eingesetzt werden
- Modulnamen müssen den vollen Pfad wiederspiegeln; lautet der Modulpfad also "Error/Mappings.pm", dann muss das Modul "Error::Mappings" heissen.

- Dein Code-Schnipsel zum Modul enthält bereits Syntaxfehler, so dass es so gar nicht laufen kann.
- Nachtrag: (nachdem ich renees Beitrag sah): Auch von meiner Seite ein ++ für Verwendung von strict und warnings ;o)

Vorschlag:

Modul:
- Methode new():
- - Array mit Meldungen füllen, referenzieren, zum Objekt machen und Referenzen zurückliefern.
- Methode get_msg():
- - Nimmt Fehlernummer entgegen und liefert die entsprechende Meldung aus dem Array oder Leerstring/undef falls Nummer nicht existiert/definiert.

Skript:
- Modul mit use einbinden;
- Objekt erstellen; Schema: my $foo = Bar->new();
- Objekt nutzen: $foo->get_msg( 2 );

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
 2009-01-14 11:48
#117922 #117922
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nur ein paar Anregungen/Hinweise:

Modulnamen, die komplett kleingeschrieben sind, werden in Perl typischerweise für sogenannte Pragmas verwendet. Für "normale" Module verwendet man typischerweise CamelCase. Das ist zwar kein Muss, aber "Best Practice". Ich würde Dir also empfehlen, das Modul z.B. "MyTest" zu nennen.

Du verwendest "use strict" und "use warnings" => Daumen hoch. Sehr gut!

Ist das "use IPC::Open2" ein Überbleibsel aus dem wirklichen Code, oder warum lädst Du das im Modul?

Beim open solltest Du immer die "Richtung" angeben und eine Fehlerbehandlung machen. Es ist auch besser Wiki:lexikalische Filehandles zu verwenden:
Code: (dl )
1
2
3
open( my $fh, '<', 'errormap.txt' ) or die "Fehler: $!";
# '<' zeigt, dass lesender Zugriff ist ('>' steht für schreibend, siehe perldoc -f open)
# in $! steht der Fehler (siehe perldoc perlvar)


In dem Skript hast Du use <PfadzumModul>::test; stehen. Der Packagename ist aber nur "test". Also musst Du auch nur use test; machen. Wenn das Modul außerhalb von @INC (enthält alle Pfade, in denen nach Modulen gesucht wird) liegt, dann musst Du den Pfad mit use lib $pfad hinzufügen.

Nehmen wir also an, das Modul liegt in "/pfad/zu/allen/modulen/test.pm". Dann müsste das in dem Skript so aussehen:
Code: (dl )
1
2
use lib "/pfad/zu/allen/modulen";
use test;
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/
Brenner
 2009-01-14 12:20
#117924 #117924
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Uihuihuih,

soviele Infos auf einmal.

Da brauche ich erstmal eine zeitlang die zu verstehen.


Ich werde gleich versuchen alles umzusetzen, aber momentan hab ich streckenweise das Gefühl für manche Sachen nicht schlau genug zu sein und ich weiß nicht ob das nur daran liegt das ich Perl erst seit einer Woche "kenne" und mich ohne Hilfe durchschlagen muss.


Soviel schon Mal vorweg, ich dachte das OpenModul brauche ich um Dateien einlesen zu können, geht aber auch ohne !?
Linuxer
 2009-01-14 12:25
#117925 #117925
User since
2006-01-27
3871 Artikel
HausmeisterIn

user image
Ja, das geht auch ohne.

Das ganz normale Öffnen einer Datei (lesen, schreiben, etc.) ist in der Grundausstattung vorhanden.
Wenn Du speziellere Sachen machen willst, dann kommen die entsprechenden Module ins Spiel.

http://perldoc.perl.org/perlfunc.html
Dort werden die Funktionen aufgelistet (und erklärt), die in der "Core-Distribution" von Perl enthalten sind.
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
 2009-01-14 12:26
#117926 #117926
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Die Funktion open ist im Perl-Kern schon drin!

Das hier wäre also ein funktionierendes Perl-Skript (vorausgesetzt 'test.txt' existiert).
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

open( my $fh, '<', 'test.txt' ) or die $!;
while( my $line = <$fh> ){
print $line;
}
close $fh;
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/
Brenner
 2009-01-14 13:19
#117933 #117933
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
So, meine Dateien heißen nun:

...\test02\MODUL\ERRORCODE.pm
...\test02\PRG\errorhandling.pl
...\test02\PRG\errormap.txt


Inhalt der errormap.txt ist wie gehabt.

ERRORCODE.pm
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
package MODUL::ERRORCODE;

use strict;
use warnings;


sub errormap
{
        open( my $errormaplist, '<', 'errormap.txt' ) or die "Fehler: $!";
        close $errormaplist;
}
1;



errorhandling.pl
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
#! /usr/bin/perl

use strict;
use warnings;

# include MODUL in module search path
BEGIN { push(@INC,"Z:/work/errorhandling/test02"); }

use MODUL::ERRORCODE;



Soweit läuft das schon Mal ohne Fehlermeldungen durch. Ich habe mal Testweise die errormap.txt gelöscht, aber es werden dann trotzdem keine Fehler ausgegeben.

Stimmt die Syntax dann soweit schon Mal?





@Linuxer
Code: (dl )
1
2
3
4
5
6
7
8
9
10
Modul:
- Methode new():
- - Array mit Meldungen füllen, referenzieren, zum Objekt machen und Referenzen zurückliefern.
- Methode get_msg():
- - Nimmt Fehlernummer entgegen und liefert die entsprechende Meldung aus dem Array oder Leerstring/undef falls Nummer nicht existiert/definiert.

Skript:
- Modul mit use einbinden;
- Objekt erstellen; Schema: my $foo = Bar->new();
- Objekt nutzen: $foo->get_msg( 2 );



Jaaa, ähmmm, das klingt ganz gut, aber ich habe keine Ahnung wie das umsetzen soll. Die oberen Links werden bei mir leider nicht geladen. Weißt du wo es dazu ein Beispiel gibt?
<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten



View all threads created 2009-01-13 17:30.