Schrift
[thread]13035[/thread]

Bei Abfrage des Rückgabewerts aus einer Subroutine gibts Fehler...

Leser: 2


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
Brenner
 2009-01-22 12:26
#118231 #118231
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
teil Subroutine:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub logfilename {
        my $self = shift;
                
        my $logfilename;
        
        if ($self->[1]) {
                $logfilename = $self->[1]; }
        else {
                $logfilename = "DEFAULT_logfile_name";  }
                                
        return $logfilename;
}



aufruf im hauptprogramm:

Code (perl): (dl )
1
2
my $log2 = <Modulpfad>->logfilename();
print "Zurueckgegebener Wert von der subroutine: ".$log2;



Die Subroutine macht soweit alles vernünftig und der Returnwert ist auch der den ich haben will. Wenn ich den Wert aber so im Hauptprogramm versuche wieder rauszufischen bekomme ich folgende Meldung.

Code: (dl )
1
2
3
Z:\test> perl test_log.pl
Can't use string ("<Modulpfad>") as an ARRAY ref while "strict refs" in u
se at Z:/test/log.pm line 99.


Line 99 ist

if ($self->[1]) {

in der Subroutine.
Linuxer
 2009-01-22 12:36
#118232 #118232
User since
2006-01-27
3872 Artikel
HausmeisterIn

user image
Wenn $self keine Array-Referenz enthält, dann kannst Du auch kein Array-Element dereferenzieren.

Das Problem ist wahrscheinlich, dass mit

Code: (dl )
<Mdoulpfad>->logfilename();


kein Objekt in $self landet, sondern nur der String, der das Modul bezeichnet.

Ohne den konkreten Code am Stück zu kennen, denke ich, dass folgendes möglicherweise helfen kann:

Code: (dl )
1
2
3
# hierbei sollte eine "blessed array reference" zurückgeliefert werden
my $object = <Modulpfad>->new();
my $log2 = $object->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 13:00
#118233 #118233
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Ich habe mit Data::Dumper nachgeschaut.

In $self landet das gesamte array welches im Hauptprogramm übergeben wurde.
In z.B $self->[1] ist dann auch der entsprechende Wert drin.



Code: (dl )
my $object = <Modulpfad>->new();

Läuft noch sauber durch, aber dan bei
Code: (dl )
my $log2 = $object->logfilename();


kommt wieder die identische Meldung.
pq
 2009-01-22 13:04
#118234 #118234
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Brenner+2009-01-22 12:00:52--
Ich habe mit Data::Dumper nachgeschaut.

In $self landet das gesamte array welches im Hauptprogramm übergeben wurde.
In z.B $self->[1] ist dann auch der entsprechende Wert drin.

wenn perl sagt, dass es an der stelle einen string hat, dann hat perl in den allermeisten fällen
recht. mir ist noch kein fall untergekommen, in dem es anders war. also, an der stelle, wo die
fehlermeldung kommt, steht in $self ein string, das kannst du ganz einfach überprufen, indem
du dein dumper-statement direkt drüberschreibst.
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-22 13:04
#118235 #118235
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Wenn ich "use strict" in der Subroutine auskommentiere läuft alles sauber durch, aber das ist jan icht Sinn der Sache.
pq
 2009-01-22 13:06
#118237 #118237
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Brenner+2009-01-22 12:04:26--
Wenn ich "use stricts" im Hauptprogramm auskommentiere läuft alles sauber durch, aber das ist jan icht Sinn der Sache.

es heisst strict und nicht stricts, und nein, das ist nicht sinn der sache.
bevor du eine arrayref dereferenzieren willst, musst du prüfen, ob es eine arrayref ist.
Code (perl): (dl )
if (ref $self eq 'ARRAY' and $self->[1])

im übrigen finde ich es keinen schönen stil, irgendwelche attribute über array-indizes abzufragen,
das kann sich ja kein mensch merken. benutze wenigstens konstanten mit sprechenden namen.
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-22 13:09
#118238 #118238
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Hmm, anscheinend doch nicht. In der Sub hatt alles die richtigen Werte, aber im Hauptprg. steht noch eine alte Variable, nämlich "DEFAULT_logfile_name".
Brenner
 2009-01-22 13:17
#118239 #118239
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
pq+2009-01-22 12:06:19--
Brenner+2009-01-22 12:04:26--
Wenn ich "use stricts" im Hauptprogramm auskommentiere läuft alles sauber durch, aber das ist jan icht Sinn der Sache.

es heisst strict und nicht stricts, und nein, das ist nicht sinn der sache.
bevor du eine arrayref dereferenzieren willst, musst du prüfen, ob es eine arrayref ist.
Code (perl): (dl )
if (ref $self eq 'ARRAY' and $self->[1])

im übrigen finde ich es keinen schönen stil, irgendwelche attribute über array-indizes abzufragen,
das kann sich ja kein mensch merken. benutze wenigstens konstanten mit sprechenden namen.


Oh, jetzt sind die Beiträge etwas durcheinander.

Mit stricts hatte ich mich verschrieben, hatte natürlich strict stehen.


Mit deinen Zeilenersatz
Code (perl): (dl )
if (ref $self eq 'ARRAY' and $self->[1])

erscheint keine Meldung mehr.
Linuxer
 2009-01-22 13:30
#118240 #118240
User since
2006-01-27
3872 Artikel
HausmeisterIn

user image
Hast Du denn verstanden, was pq "Zeilenersatz" macht?

Ich muss gestehen, mit den von Dir gemachten Angaben, vermag ich nicht, mir vorzustellen, was Du da eigentlich treibst...
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 13:34
#118241 #118241
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Ich schnall es nicht, können wir das ganze nochmal auf Dummieniveau durchgehen?


$self bekommt aus dem Hauptprogramm Werte. Wenn ich $self dumpere steht da z.B.

Code: (dl )
1
2
3
4
5
6
$VAR1 = [
'1',
'logfile',
'C:\\WINNT\\system32\\config'
];
$VAR1 = '<Modulpfad><Modulname>';


drin.

Mit $self->[1] hole ich mir dann den Wert 'logfile' raus und arbeite damit.

!?


edit:
Werd wohl nochmal alles posten müssen. Wollte nur nicht wieder ganz von vorne anfangen müssen :-(
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



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