Schrift
[thread]6191[/thread]

Perl - Sub Routinen Parameter.

Leser: 3


<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten
Gast Gast
 2004-04-13 21:22
#81524 #81524
Hi!

Ich muß in Perl etwas Programmieren und hab in Perl so gut wie keine Erfahrung.
Ich habe mir als Klassenersatz Packete angelegt und bin etwas verwirrt:

Rufe ich eine sub innerhalb des Packetes auf erhalte ich meine Parameter ab $_[0]. Rufe ich aber die sub über ein Objekt (wenn man das so nennen darf) auf steht in $_[0] vermutlich sowas wie this.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package test; 
@EXPORT = qw(new,test,test2);
sub new
{
my $self = {};
$self->{"hallo"} = "";
bless $self;
return $self;

}

sub test
{
test2("Hallo Welt");
}

sub test2
{
print "0 : $_[0]\n";
print "1 : $_[1]\n";
}


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
package test;
@EXPORT = qw(new,test,test2);
sub new
{
my $self = {};
$self->{"hallo"} = "";
bless $self;
return $self;

}

sub test
{
test2("Hallo Welt");
}

sub test2
{
print "0 : $_[0]\n";
print "1 : $_[1]\n";
}


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package test; 
@EXPORT = qw(new,test,test2);
sub new
{
my $self = {};
$self->{"hallo"} = "";
bless $self;
return $self;

}

sub test
{
test2("Hallo Welt");
}

sub test2
{
print "0 : $_[0]\n";
print "1 : $_[1]\n";
}


Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl 

use test;

my $t = test::new;

$t->test();
$t->test2("GZGZ");


Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl 

use test;

my $t = test::new;

$t->test();
$t->test2("GZGZ");


Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl 

use test;

my $t = test::new;

$t->test();
$t->test2("GZGZ");


Ausgabe:

Code: (dl )
1
2
3
4
0 : Hallo Welt 
1 :
0 : test=HASH(0x804b248)
1 : GZGZ

Code: (dl )
1
2
3
4
0 : Hallo Welt 
1 :
0 : test=HASH(0x804b248)
1 : GZGZ

Code: (dl )
1
2
3
4
0 : Hallo Welt 
1 :
0 : test=HASH(0x804b248)
1 : GZGZ


Da es ja nun in Perl imho sowas wie private etc. nicht gibt kann eine Methode ja von "aussen" als auch von "innen" aufgerufen werden.
Wie handlet man da die o.g. Tatsache ? Die Parameter die man erwartet stehen ja also wo anderst.

Gibt es eine bessere / sinvollere Möglichkeit die Parameter zu übergeben ?
z.B. benannt ?

Code: (dl )
1
2
3
4
sub test($string) 
{
print $string;
}


Mir fehlen die Stichworte um bei Google was zu finden und das alte Perl Buch geht nicht mal auf packages ein.
Edit: Code tags eingefügt by format_c\n\n

<!--EDIT|format_c|1081880182-->
jan
 2004-04-13 21:26
#81525 #81525
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
methoden eines objektes erhalten als ersten parameter das objekt selbst .
format_c
 2004-04-13 22:27
#81526 #81526
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Naja was heist bessere oder sinnvollere. Ich sag mal das ist gewöhnungssache. Ich find die Parameterübergabe gut.
Deine Ausgabe deines Tests ist auch absolut nachzuvollziehen. es gibt auch noch die Spezial variable @_ wo alle übergabeparameter enthalten sind.
my ($p1,$p2,$p3) = @_;
Oder du nimmst dir die Parameter einzeln aus dem Array mit
my $p1 = shift @_; # oder einfach nur shift; @_ nimmt shift implizit
my $p2 = shift;
my $p3 = shift;


Gruß Alex
Knuddlbaer
 2004-04-13 22:43
#81527 #81527
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
thx für die Codetags

Das ist schon klar.

Das Problem ist:

Ich habe eine Klasse die als Parameter eine ID bekommt und mit hilfe der ID etwas machen soll.

Diese Methode wird einmal von "aussen" verwendet:

$kunde->get_counter($id);

Nun gibts aber in der Klasse kunde eine weitere Methode die get_counter intern aufruft.

Nun hab ich die ID einmal in $_[0] und einmal in $_[1]
bzw. einmal schiften und garnicht schiften.

Im mom übergebe ich bei dem Internen Aufruf einfach die Referenz auf das objekt mit:

get_counter(self,$internalID);


Die Frage wäre nu ob ich das total falsch verstehe.
In C++ macht das keinen Unterschied ob ich nun extern oder intern einen Aufruf mache. This wird übergeben.
format_c
 2004-04-13 22:56
#81528 #81528
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ach jetzt dämmerts.
Dann mach sowas in der Art:
shift if ref $_[0] eq 'HASH';
Das schmeist den ersten Parameter, das Objekt das eine Hashreferenz ist, weg.

Gruß Alex\n\n

<!--EDIT|format_c|1081882666-->
renee
 2004-04-13 23:00
#81529 #81529
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du kannst auch innerhalb des Moduls das ganze Objektorientiert aufrufen:

statt get_counter(self,$internalID);

einfach $self->get_counter($internalID);
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/
format_c
 2004-04-14 01:51
#81530 #81530
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@renee: stimmt allerdings.

Gruß Alex
Knuddlbaer
 2004-04-14 12:53
#81531 #81531
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
Aaallsoooo:

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
package test;
@EXPORT = qw(new);
sub new
{
 my $self = {};
 bless $self;
 return $self;

}

sub test
{
   $self->test2("Hallo Welt");
}

sub test2
{
print "\n";
my $i = 0;
   foreach(@_)
   {
       print "$i : $_\n";
       $i++;  }


}


Fürht zu:

Quote
Can't call method "test2" on an undefined value at test.pm line 13.


Ich denke da hab ich generell noch was falsch ?! :o(
jan
 2004-04-14 13:01
#81532 #81532
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
sub test holt sich ja auch nicht $self.

Code: (dl )
1
2
3
4
5
sub test
{
my $self = shift;
$self->test2("Hallo Welt");
}
Knuddlbaer
 2004-04-14 13:04
#81533 #81533
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
Ja das setzt doch aber wieder vorraus das $_[0] self ist ?!
<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten



View all threads created 2004-04-13 21:22.