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 4)



<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten
Gast Gast
 2009-01-15 17:57
#118031 #118031
Versuch es mal so:

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
45
46
47
48
49
50
51
52
53
54
#! /usr/bin/perl
use strict;
use warnings;


package ERRORCODEOBJ;

sub new
{
  my $class=shift;
  my $file = shift or 'errormap.txt';

  my $self={};
  $self->{file_name}=$file;
  $self->{ERRORS}=[];

  bless($self,$class);

  $self->load();

  return $self;
}

sub load
{
  my $self=shift;
  my $filename=$self->{filename};

  open( my $errormaplist, '<', $filename ) or die "error open $filename : $!";
  my @lines = <$errormaplist>;
  close $errormaplist;

  chomp(@lines);

  $self->{ERRORS}=\@lines;
}

sub errormap
{
  my $self = shift;
  my $line =shift;

  if($line < @{$self->{ERRORS}} and $line >= 0)
  {
    return $self->{ERRORS}->[$line];
  }

  return undef;
}

package main;

my $objekt=ERRORCODEOBJ->new();
print $objekt->errormap(1)."\n";
FoolAck
 2009-01-15 18:11
#118033 #118033
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Quote
Ich verstehe 50% was du meinst und weiß kaum wie ich es umsetzen soll.

Naja, halt mit Plan drangehen. Und Tipps natürlich nur umsetzen, wenn dir die Argumentation dafür klar ist.
Zum Beispiel musst du jetzt, wo dein Objekt nichts mehr ausgibt natürlich den return-Wert der Methode selber ausgeben:
Code (perl): (dl )
1
2
3
4
5
6
# statt:
#my $objekt3=ERRORCODEOBJ->new();
#$objekt3->errormap(1);
# einfach:
my $obj = ERRORCODEOBJ->new();
print $obj->errormap(1);

Oder den Returnwert in einer extra Variable speichern etc. pp.

Das es nur notwendig ist, die Datei einmal einzulesen (wenn sich deren Inhalt nicht mit der Zeit ändert...) sollte dir eigentlich auch klar sein. Das hat nämlich nix mit perl zu tun.

Das mit der Hashreference anstatt der Arrayreference als Objekt hast du verstanden, oder? Wenn nicht, weißt du wahrscheinlich nicht, was ein hash ist.. Oder du weißt nicht, dass man quasi alle Referenzen zu Objekten bless()en kann.
Was ich damit ausdrücken wollte: $self->{errorCodes} ist lesbarer als $self->[3]. Und wenn man schon ein Array als Objekt nimmt wie gesagt Konstanten. Dann wird aus $self->[3] ein $self->[errorCodes]. Aber naja, performancemäßig sind arrays etwas schneller und speichermäßig wesentlich ökonomischer als hashes, aber bei so kleinen Modulen... Naja, ich bin mal wieder still. :)
Brenner
 2009-01-16 10:43
#118059 #118059
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
@Gast:

Danke, aber das wirft nur viele viele Fehler und hilft mir ohne Erklärung nicht wirklich.

Code: (dl )
1
2
3
4
5
6
Z:\work\errorhandling\test02\MODUL>perl ERRORCODEOBJ2.pl
syntax error at ERRORCODEOBJ2.pm line 2, near "02:"
"use" not allowed in expression at ERRORCODEOBJ2.pm line 2, near ": "
"use" not allowed in expression at ERRORCODEOBJ2.pm line 3, near ": "
Illegal octal digit '8' at ERRORCODEOBJ2.pm line 8, at end of line
Illegal declaration of subroutine main::new at ERRORCODEOBJ2.pm line 9.




@FoolAck:
Die Fehlerliste wird sich noch sehr häufig ändern, aus diesem Grund habe ich das erst einmal so gelassen wie es ist.


Nach einem frischen Kaffe und Ruhe im Raum habe ich sogar eben einen Minierflog gehabt. Mir viel etwas von einer Onlinelektion von gestern ein und konnte es prompt umsetzen.

Jetzt sieht das Programm gerade so aus, ich weiß nur noch nicht wie ich im Hauptprogramm den Returnwert aus der subroutine übergeben. Ausserdem wird es sich doch jetzt mit den Objekten beißen (Wertübergabe) wenn ich einen Wert aus dem Hauptprogramm überliefere!?

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

package ERRORCODEOBJ;

use strict;
use warnings;


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

sub errormap
{
        #use Data::Dumper;
    #print Dumper(\@_);
        
        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 = $$lines[$$line[0]];
        my $ausgabe = \@lines;
        print "ausgabe: ".$$ausgabe[$line];
        my $wert = $$ausgabe[$line];
        return $wert;
        
        
}

my $obj=ERRORCODEOBJ->new();
$obj->errormap(2);
Gast Gast
 2009-01-16 11:19
#118063 #118063
Brenner+2009-01-16 09:43:31--
@Gast:

Code: (dl )
1
2
3
4
5
6
Z:\work\errorhandling\test02\MODUL>perl ERRORCODEOBJ2.pl
syntax error at ERRORCODEOBJ2.pm line 2, near "02:"
"use" not allowed in expression at ERRORCODEOBJ2.pm line 2, near ": "
"use" not allowed in expression at ERRORCODEOBJ2.pm line 3, near ": "
Illegal octal digit '8' at ERRORCODEOBJ2.pm line 8, at end of line
Illegal declaration of subroutine main::new at ERRORCODEOBJ2.pm line 9.

Es bringt nichts die "01:" und "02:" etc. mit zu kopieren!!!
Gast Gast
 2009-01-16 11:20
#118064 #118064
Dein Skipt:
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
45
46
47
48
49
50
51
#! /usr/bin/perl

package ERRORCODEOBJ;

use strict;
use warnings;

# bitte immer zusammen mit dem Klassennamen Blessen
# das ist sauberer
sub new
{
  my $class=shift;
  my $zeiger=[ ];
   bless($zeiger,$class);
}

sub errormap
{
        #use Data::Dumper;
    #print Dumper(\@_);
        
        my $self = shift;
        #$$line[0]=$_[0];
        # hier kannst du auch
        my $line=shift;
        # schreiben anstatt
        # my ($line) = @_;
        
        open( my $errormaplist, '<', 'errormap.txt' ) or die "Fehler: $!";
        my @lines = <$errormaplist>;
        close $errormaplist;
        
        # warum so enorm kmpliziert?!

        ##print $lines[ $linenr ];
        ##my $ausgabe = $$lines[$$line[0]];
        #my $ausgabe = \@lines;
        #print "ausgabe: ".$$ausgabe[$line];
        #my $wert = $$ausgabe[$line];
        #return $wert;

        # das ist doch viel einfacher
        return $lines[$line];
}

# bitte wieder in das paket "main" wechseln
package main;
my $obj=ERRORCODEOBJ->new();
# wenn du schon die funktion aufrufst,
# so kannst den Rückgabewert doch auch gleich Ausgeben
print "Error:".$obj->errormap(2)."\n";
Gast Gast
 2009-01-16 11:24
#118065 #118065
Mit Erklährung
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#! /usr/bin/perl
use strict;
use warnings;

# vom paket "main" in das Paket "ERRORCODEOBJ" wechseln
package ERRORCODEOBJ;

sub new
{
# wenn Opjekt mit "xyz->new()" erzeugt wird,
# ist das erste übergebene Argument der Klassenname.
# in diesem Fall "ERRORCODEOBJ"
my $class=shift;
# mögliche übergabe des dateinamens,
# in der die die errors gespeichert sind.
# wenn das shift (auch bekannt als "shift(@_)" ) nicht funktioniert,
# dann soll "errormap.txt" in der Variable stehen;
my $file = shift || 'errormap.txt';

# üblich ist eine hashreferenz
my $self={};

# hier wird der Dateiname der zu lesenden Datei gespeichert
$self->{file_name}=$file;
# Platz fpr die liste der Errors.
$self->{ERRORS}=[];

# zusammen mit dem Klassennamen
# machen wir aus der referenz ein Objekt
bless($self,$class);

# wir liefern das Objekt zurück
return $self;
}

sub load
{
my $self=shift;
my $filename=$self->{file_name};

open( my $errormaplist, '<', $filename ) or die "error open $filename : $!";
my @lines = <$errormaplist>;
close $errormaplist;

# zeilenunbrüche entferenen;
chomp(@lines);

# die Referenz von @lines
# in der Objektvariable "ERRORS"
# speichern
$self->{ERRORS}=\@lines;
}

sub errormap
{
my $self = shift;
my $line =shift;

# Liste aktuell halten
$self->load();

# abgrage,
# ob die zeilennummer überhaupt innerhalb der Größe der Errorliste ist
if($line < @{$self->{ERRORS}} and $line >= 0)
{
# wenn es der hall ist,
# dann gib die Fehlermeldung an der Stelle zurück
return $self->{ERRORS}->[$line];
}
# ansonsten gib "undef" zurück.
return undef;
}

# wir wechsln wieder nach "main"
package main;

# es wird das Objekt gebildet;
my $objekt=ERRORCODEOBJ->new();
# wir machen eine Abfrage
print $objekt->errormap(1)."\n";

Speichert als xyz.pl und ausführen.
Brenner
 2009-01-16 11:26
#118066 #118066
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
@Gast:

Danke für die Mühe, werds gleich mal probieren und verzuchen zu verstehen.
<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten



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