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 (Seite 3)



<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten
Brenner
 2009-01-14 16:57
#117978 #117978
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
renee+2009-01-14 15:27:43--
$errormaplist ist kein Array sondern ein Filehandle. Du kannst jetzt entweder alles in ein Array lesen und dann das Element ausgeben oder aber - was besser ist - Du durchläufst die while-Schleife und gibst die Zeile aus, wenn es die gewünschte Zeile ist:

Code: (dl )
1
2
3
4
5
6
7
8
9
sub errorcode {
my ($linenr) = @_;

open my $errormap, '<', 'errormap.txt' or die $!;
my @lines = <$errormap>;
close $errormap;

print $lines[ $linenr-1 ];
}



Ich habe mich erstmal für diese Variante entschieden weil sie für mich erst Mal am einfachsten ist und ich mit arrays arbeiten kann. Danke für die Erklärung mit dem FIlehandle und array, jetzt weiß ich warum das nicht geklappt hat.


@FoolAck
Was ist $foo? Das Programm läuft jetzt sauber, ohne Fehlermeldungen vom Interpreter durch.


@Linuxer:
Jetzt können wir uns an das objektoriente ranmachen. Ich werde es natürlich erstmal selber versuchen. Ich denke das hier: http://www.infos24.de/perle/handbuch/14_objektorie... verstehe ich einigermaßen.
Linuxer
 2009-01-14 17:08
#117979 #117979
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Das liest sich doch gut.

Viel Spaß und Erfolg beim Versuch ;o)
Sollte was nicht passen, meld Dich wieder ;o))
Solltest Du Erfolg haben, auch ;o)))
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!
Brenner
 2009-01-14 17:27
#117982 #117982
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Das werd ich machen.

Ich freue mich über eure Hilfe und die gute Behandlung!
FoolAck
 2009-01-14 17:28
#117983 #117983
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
By teh way:
Sollte das wirklich die komplette Problemstellung sein ist es IMHO ziemlich hirnrissig das mit ner extra Klasse zu machen... (Wenns dir vorgegeben ist das mit nem Modul zu machen kannst du natürlich nichts dafür, aber ich wollts nur mal erwähnen..)
perl ist schließlich kein java :/

Und zum lernen von objektorientierter Programmierung ist das Beispiel auch recht suboptimal. perltoot ist sehr informativ.
Brenner
 2009-01-14 18:10
#117988 #117988
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Hab auch grad gemerkt das ich damit nicht wirklich was anfangen kann.

Ja, ich soll das alles mit Modulen machen, es ist auch nur ein Minimini Teil eines großes Gesamten.

Gibts denn noch was möglichst deutsches zum reinkommen in die "objekte" möglichst mit Modulen usw. erklärt?
#Kein Kommentar
 2009-01-14 22:37
#117996 #117996
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
die perldoc dazu auf deutsch: perlobj
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
Brenner
 2009-01-15 16:35
#118022 #118022
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Ich habe mal versucht anzufangen, aber leider, wie erwartet, hats nicht geklappt.


Ich habe erstmal alles in ein Programm gepackt weil ich noch nicht weiß wie es hier mit der Übergabe ins Hautpprogramm aussieht.


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
#! /usr/bin/perl

package ERRORCODEOBJ;

use strict;
use warnings;


sub new
{
  my $zeiger=[ ];
   bless($zeiger);
}

sub errormap
{
        #my ($linenr) = @_;
        my $line=shift;
        $$line[0]=$_[1];
        
        open( my $errormaplist, '<', 'errormap.txt' ) or die "Fehler: $!";
        my @lines = <$errormaplist>;
        close $errormaplist;
        
        #print $lines[ $linenr ];
        print $$errormaplist[$$line[0]];
}

my $objekt3=ERRORCODEOBJ->new();

#Hier versuche ich die Zahl 1 zu übergeben damit sie im Sub genutzt wird um die passende Meldung auszugeben.
$objekt3->errormap(1);
Brenner
 2009-01-15 16:36
#118023 #118023
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Achja,

als Meldung beim Ausführen kommt die Meldung wenn keine passender Eintrag in der errormap.txt gefunden wurde.
FoolAck
 2009-01-15 17:07
#118026 #118026
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Ein paar Tips: Ich würde eine Hashreference als Objekt benutzen. Respektive, wenn ich ein Array benutzen würde, würde ich auch "Konstanten" (sind afaik nur inline Funktionen) benutzen. Damit du (im Modul selber) sowas schreiben kannst wie
Code (perl): (dl )
$self->[ERRORLIST]
Wobei ERRORLIST hier eine Funktion ist, die einfach eine Konstante zurück gibt, ist halt einfach nur lesbarer dadurch..
Desweiteren: ich würde in jedem Fall das Array mit den Informationen aus der Datei im Objekt speichern. Es ist hart sinnlos das bei jeder Abfrage erneut einzulesen.. (Es sei denn die Textdatei ändert sich mit der Zeit.)

Ich würde auch nicht die Info direkt ausgeben, sondern den String mit der Info returnen, es sei denn die Funktion (Methode) weist namentlich direkt darauf hin, dass etwas ausgegeben wird.

Code (perl): (dl )
1
2
3
#my ($linenr) = @_;
my $line=shift;
$$line[0]=$_[1];

Was soll ich dazu sagen? :T
Erstmal: ich würde mein Objekt (das in die Methoden ja klassischerweise am Anfang "reingeshiftet" wird) immer gleich nennen.. ($self hat sich eingebürgert. Kannst es natürlich auch irgendwie anders nennen, aber ich würde schon empfehlen es im Modul überall gleich zu nennen...)
2. Hat es wirklich einen Sinn den Funktionsparameter dauerhaft im Objekt zu speichern? (Ich würde schätzen: nein!)
3. shift verändert ein Array. Ich schätze also mal, dass du hier $_[0] meintest...
(Besser schreibt man das aber wie in deiner auskommentierten Zeile, nämlich als 'my ($lineNr) = @_'. Hat den Vorteil der Lesbarkeit..)

I could go on.. Aber das solls erstmal sein.

edit: ein Hinweis noch: wenn du dir nicht sicher bist was eine bestimmte Variable oder so enthält (zum Beispiel die Argumentenliste in deiner Methode) empfiehlt es sich einfach mal einen Blick rein zu werfen: (Bequemerweise mit Data::Dumper)
Code: (dl )
1
2
3
sub errormaplist {
use Data::Dumper;
print Dumper(\@_)

Sollte man natürlich nachm debuggen wieder entfernen...
Brenner
 2009-01-15 17:33
#118029 #118029
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Hmmm,

bin jetzt wieder unsicherer als vorher. Ich verstehe 50% was du meinst und weiß kaum wie ich es umsetzen soll.

Hab einfach mal was versucht...


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
#! /usr/bin/perl

package ERRORCODEOBJ;

use strict;
use warnings;


sub new
{
  my $zeiger=[ ];
   bless($zeiger);
}

sub errormap
{
        
        my $self = shift;
        #$$line[0]=$_[0];
        my ($line) = @_;
        
        open( my $errormaplist, '<', 'errormap.txt' ) or die "Fehler: $!";
        my @lines = <$errormaplist>;
        close $errormaplist;
        
        #print $lines[ $linenr ];
        my $ausgabe = $$errormaplist[$$line[0]];
        return $ausgabe;
}

my $objekt3=ERRORCODEOBJ->new();
$objekt3->errormap(1);
<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten



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