Schrift
[thread]11726[/thread]

Verwendung von Instanzvariablen ?!?



<< >> 9 Einträge, 1 Seite
JackBauer
 2008-04-30 14:54
#109019 #109019
User since
2008-04-30
16 Artikel
BenutzerIn
[default_avatar]
Hi!

Ich habe mir folgende Klasse definiert (nur das wesentlich dargestellt):

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
package mcg_util;

sub new
{
my $class = shift;
my $self = {};
$self->{reader} = undef;

bless ($self, $class);
return $self;
}

#accessor method for Testcase reader
sub reader
{
my $self = shift;
if (@_) { $self->{reader} = $shift }
return $self->{reader};
}

sub run
{
my %params = (
'reader' => $self->{reader},
@_,
);

my $enable_running_mcg = $params{'reader'}->getTestCaseParam("enable_running_mcg");
}


In einer anderen Datei erstelle ich mir dann eine Instanz der Klasse wiefolgt:

Code: (dl )
1
2
3
		my $testcase = mcg_util->new();
$testcase->reader($reader);
$testcase->run();


Mit $testcase->reader($reader) möchte dabei die Variable $reader der Instanz zuweisen und in der Run-Methode anschließend darauf zugreifen. Anstattdessen erhalte ich allerdings die Fehlermeldung, dass die Methode getTestCaseParam nicht mit einem uninitialisierten Wert aufgerufen werden kann. Was geht hier schief?


Normalerweise programmiere ich in C++ oder Java. Seit kurzen bin ich allerdings dazu gezwungen Perl einzusetzen - daher bin ich für jeden Tipp dankbar :-)

Gruß JackBauer
renee
 2008-04-30 14:58
#109020 #109020
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schau Dir mal diese Zeile ganz genau an:
Code: (dl )
if (@_) { $self->{reader} = $shift }


Und noch ein Tipp: Verwende Wiki:use strict
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/
KurtZ
 2008-04-30 14:59
#109021 #109021
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
nicht $shift sondern nur shift!

würdest du use strict und use warnings benutzen würde dich der compiler vor undeklarierten Variablen und ähnlichen Fehlern bewahren.
TMTOWTDYOG (there's more than one way to dig your own grave)
JackBauer
 2008-04-30 15:18
#109022 #109022
User since
2008-04-30
16 Artikel
BenutzerIn
[default_avatar]
Danke, genau das war's :)

use strict; und use warning; kann ich leider nicht verwenden. Ich rufe den Perl Code nicht direkt auf, sondern über SOAP. Wenn ich die beiden Befehle eingebe, erhalte ich nur Fehlermeldungen ...

Eine Kleinigkeit hätte ich noch:

Warum muss ich in der Run-Methode am Anfang my $self=shift; scheiben, um anschließend mittels $self auf meine Instanzvariablen zuzugreifen? Der Methode run wird schließlich nichts übergeben, also müßte doch shift leer sein?!?
renee
 2008-04-30 15:29
#109023 #109023
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
JackBauer+2008-04-30 13:18:03--
Danke, genau das war's :)

use strict; und use warning; kann ich leider nicht verwenden. Ich rufe den Perl Code nicht direkt auf, sondern über SOAP. Wenn ich die beiden Befehle eingebe, erhalte ich nur Fehlermeldungen ...

Einfach mal den von mir verlinkten Artikel lesen. Die beiden Pragmas sind sehr sinnvoll, weil sie viel Fehler vermeiden.

Quote
Eine Kleinigkeit hätte ich noch:

Warum muss ich in der Run-Methode am Anfang my $self=shift; scheiben, um anschließend mittels $self auf meine Instanzvariablen zuzugreifen? Der Methode run wird schließlich nichts übergeben, also müßte doch shift leer sein?!?


Durch den Aufruf $self-> wird $self automatisch als erster Parameter übergeben.
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/
KurtZ
 2008-04-30 15:30
#109024 #109024
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
JackBauer+2008-04-30 13:18:03--
Warum muss ich in der Run-Methode am Anfang my $self=shift; scheiben, um anschließend mittels $self auf meine Instanzvariablen zuzugreifen? Der Methode run wird schließlich nichts übergeben, also müßte doch shift leer sein?!?


das ist keine Kleinigkeit sondern ein essentieller Unterschied. Wenn du eine Methode mit $name->meth() aufrufst ist der erste Parameter automatisch die Referenz $name. Das könnte eine Klasse oder auch ein Objekt sein, und so kannst du zwischen Klassen und Objektmethoden unterscheiden.

NACHTRAG: ich gewöhne mir jetzt vorm Posten eine Renee-Reaktions-Pause an,dann spar ich Energie ;-)
TMTOWTDYOG (there's more than one way to dig your own grave)
pq
 2008-04-30 16:46
#109031 #109031
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
JackBauer+2008-04-30 13:18:03--
use strict; und use warning; kann ich leider nicht verwenden. Ich rufe den Perl Code nicht direkt auf, sondern über SOAP. Wenn ich die beiden Befehle eingebe, erhalte ich nur Fehlermeldungen ...

hättest du den verlinkten artikel wenigstens gelesen:
"Alle sagen, ich soll use strict verwenden, aber ich weiß gar nicht, was mir das bringt, und außerdem funktioniert mein Skript dann nicht mehr."
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
KurtZ
 2008-04-30 17:21
#109034 #109034
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
du solltest erwägen bei Entwicklung und Test deines Scripts strict udn warnings zu aktivieren.

Wenn's mit soap nicht läuft (warum?) kannst du es ja in der Produktion ohne Probleme wieder rausnehmen.
TMTOWTDYOG (there's more than one way to dig your own grave)
pktm
 2008-04-30 20:05
#109050 #109050
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Die Fehler die dann kommen sind übrigens (potentiell) in deinen Programmen so oder so enthalten. strict & warnings weisen dich nur darauf hin. Aber das steht alles in dem Artikel :)
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 9 Einträge, 1 Seite



View all threads created 2008-04-30 14:54.