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

Bei Abfrage des Rückgabewerts aus einer Subroutine gibts Fehler... (Seite 2)

Leser: 2


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
Struppi
 2009-01-22 13:35
#118242 #118242
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Wie sieht eigentlich deine Konstruktorfunktion aus?
Brenner
 2009-01-22 13:38
#118243 #118243
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Moment, ich mache nochmal alles fertig.
Brenner
 2009-01-22 13:44
#118244 #118244
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Hauptprogramm:


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

use strict;
use warnings;
use vars qw(@ISA @EXPORT $VERSION);

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

use test::log;



my @XLOGVALUES001;
my $XLOGVALUES001;

while(@XLOGVALUES001)
{
shift(@XLOGVALUES001);
}

$XLOGVALUES001[0] = "1";        #logfile schreiben: ja = 1     nein = 2
$XLOGVALUES001[1] = "logfile";  #name des logfiles:  "logfile.txt"
$XLOGVALUES001[2] = 'C:\WINNT\system32\config'; #pfad des logfiles:   


&test::log::logfilename(\@XLOGVALUES001);


$log2 = test::log->logfilename();
print "Zurueckgegebener Wert von der subroutine: ".$log2;




Subroutine:

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
package test::log;

use strict;
use warnings;
$test::log::VERSION = "0.0.1";

#============================================================================
## @cmethod
# The default constructor of class test::log
#============================================================================
sub new {
        my $this=shift;
        my $class=ref($this) || $this;
        my $self= {};

        #class attributes
        $self->{attr1}=undef;

        #bless the object
        bless($self,$class);

        #return the reference to the blesses object
        return($self);
}


sub logfilename {
        my $self = shift;
                        
        my $logfilename;
        
        if (ref $self eq 'ARRAY' and $self->[1]) {
                $logfilename = ($self->[1]); 
                 }
        else {
                $logfilename = "DEFAULT_logfile_name";
                }
                
        return $logfilename;
        
}

1;
Struppi
 2009-01-22 13:54
#118245 #118245
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
- (EDIT: war Quatsch)
- (EDIT2: auch das war falsch)

Du verwendest das Modul sehr seltsam. Es existiert ein Konstruktor der nicht aufgerufen wird, dann rufst du die Methode als statische Methode auf und dann als Membermethode. Und je nachdem ist $self entweder eine Arrayreferenz oder ein string mit dem Namen des Pakets.

Ich frag mich warum du diesen Weg gehst?
Linuxer
 2009-01-22 14:20
#118247 #118247
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Wenn Du das Modul objektorientiert erstellst, solltest Du es auch so benutzen.

Was mir auffällt:

- Ich sehe keinen Sinn für die Variablen @ISA und @EXPORT im Hauptprogramm
- Was soll Deine While-Schleife bewirken? @XLOGVALUES001 ist leer und enthält keine Werte; ausserdem, wenn Du ein Array leeren willst, verwende doch bitte: @array = ();
- Jedes Feld Deines Array hat eine Bedeutung, warum benutzt Du keinen Hash, mit dem Du die Felder sprechend benennen könntest?
- Dein Modul besitzt zwar einen Konstruktor, der aber niemals aufgerufen wird.


ein (schnell zusammengetippter(!)) Vorschlag (ungetestet):

Hauptprogramm:
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
use strict;
use warnings;

use lib qw(
  Z:/test
);
use test::log;

my $log = test::log->new(
  {
    write_logfile => 0, # 0 => nein, 1 => ja
    logfile_name  => 'logfile',
    logfile_path  => 'C:/WINNT/system32/config',
  }
);

printf "Name des Logfiles: %s\n", $log->logfilename;

__END__


Modul:
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
package test::log;
use strict;
use warnings;

$test::log::VERSION = "0.0.2";

my %defaults = (
    write_logfile => 0,  # 0 => nein, 1 => ja
    logfile_name  => 'DEFAULT_logfile_name',
    logfile_path  => 'C:/WINNT/system32/config',
);


sub new {
  my ( $class, $ref ) = @_;
  my $self;

  if ( ref( $ref ) ne 'HASH' ) {
    die "Please provide a hash reference as argument!\n";
  }

  # uebernehme die definierten Defaults und die Inhalte der übergebenen 
  # Hash-Referenz; diese Inhalte ueberlagern ggfs. die Defaults, sodass in 
  # $self die Defaults für Parameter gelten, die nicht mitgegeben wurden
  $self = { %defaults, %$ref };

  bless $self, ref( $class ) || $class;

  return $self;
}

sub logfilename {
  my ( $self, @args ) = @_;

  return $self->{logfile_name} if exists $self->{logfile_name};

  return undef;
}

1;


edit:
- $VERSION Variable im Modul eingesetzt
- Übernahme der Defaults in $self eingebaut
- TYPO fixed: logfilename != logfile_name
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-22 15:07
#118249 #118249
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Fehlerausgabe:

Code: (dl )
1
2
Use of uninitialized value in printf at test_log2.pl line 18.
Name des Logfiles:




Bis heute morgen war ich noch voller Zuversicht und jetzt bin ich wieder bei Punkt 0. :-(


Ich weiß nicht ob man das so machen kann wie in deinem Beispiel.

Grundsätzlich soll beim Aufruf des Programmes eines Moduls folgendes geschehen.

Gibt es Werte die angegeben wurden (z.B. Name des logfiles), sollen diese auch benutzt werden. Falls keine oder unsinnige Werte übergeben wurden sollen fest definierte DEFAULT Werte genommen werden.

Das geht dann immer so weiter, soll überhaupt ein logfile geschrieben werden oder nicht doch lieber in syslog (unix) oder eventhandle (windows). Und wennja welche Werte usw usw usw.



edit:

Der Konstraktor
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub new {
        my $this=shift;
        my $class=ref($this) || $this;
        my $self= {};

        #class attributes
        $self->{attr1}=undef;

        #bless the object
        bless($self,$class);

        #return the reference to the blesses object
        return($self);
}



ist inzwischen Vorgabe, aber ich weiß nicht ob sich dann trotzdem alles relisieren lässt.
Linuxer
 2009-01-22 15:10
#118250 #118250
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Sorry, Tippfehler:

logfilename != logfile_name


Habe es in meinem vorigen beitrag korrigiert; bitte nachziehen (in der Methode logfilename)
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-22 15:14
#118251 #118251
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Linuxer+2009-01-22 13:20:42--
Wenn Du das Modul objektorientiert erstellst, solltest Du es auch so benutzen.

Was mir auffällt:

1- Ich sehe keinen Sinn für die Variablen @ISA und @EXPORT im Hauptprogramm
2- Was soll Deine While-Schleife bewirken? @XLOGVALUES001 ist leer und enthält keine Werte; ausserdem, wenn Du ein Array leeren willst, verwende doch bitte: @array = ();
3- Jedes Feld Deines Array hat eine Bedeutung, warum benutzt Du keinen Hash, mit dem Du die Felder sprechend benennen könntest?
4- Dein Modul besitzt zwar einen Konstruktor, der aber niemals aufgerufen wird.


1-war noch von einem alten Programm
2-sollte nur bewirken das das array leer ist, ist anscheinend aber nonsens
3-hatte ich vor, aber ich habs nicht hinbekommen die "Hashtabelle" vom Hauptprogramm in die Subroutine zu transferieren
4-irgendwie ist mir der Sinn immer noch nicht ganz klar wenn man den Konstruktor aufruft in Zusammenhang mit den Submodulen.
Brenner
 2009-01-22 15:15
#118252 #118252
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Struppi+2009-01-22 12:54:33--
- (EDIT: war Quatsch)
- (EDIT2: auch das war falsch)

Du verwendest das Modul sehr seltsam. Es existiert ein Konstruktor der nicht aufgerufen wird, dann rufst du die Methode als statische Methode auf und dann als Membermethode. Und je nachdem ist $self entweder eine Arrayreferenz oder ein string mit dem Namen des Pakets.

Ich frag mich warum du diesen Weg gehst?


Weil ich zu dumm es richtig zu machen, mangels Erfahrung im Umgang mit Perl.
Brenner
 2009-01-22 15:32
#118255 #118255
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Linuxer+2009-01-22 14:10:25--
Sorry, Tippfehler:

logfilename != logfile_name


Habe es in meinem vorigen beitrag korrigiert; bitte nachziehen (in der Methode logfilename)


Danke, jetzt geht es...
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2009-01-22 12:26.