Schrift
[thread]7272[/thread]

Module

Leser: 3


<< |< 1 2 3 >| >> 29 Einträge, 3 Seiten
Strazke
 2005-09-14 01:27
#57877 #57877
User since
2005-07-11
120 Artikel
BenutzerIn
[default_avatar]
Hallo, ich habe hier(http://www.troubleshooters.com/codecorn/littperl/perloop.htm) eine Anleitung zum Objektorientierten Programmieren mit Perl gefunden. Dabei verstehe ich aber (teils auch wegen meinem chlechtem Englisch ;) ) manche sachen nicht. Ich hoffe Ihr könnt mir helfen:

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
sub new
{
#Arg0 is the type because the constructor will look like
# my($instance) = Tree->new(arg1,arg2,whatever)
#so arg0 will be Tree.
my($type) = $_[0];

#Make subroutine-local var $self, and make it a reference.
#Specifically, make it a reference to a (right now) empty hash.
#Later on, that hash will contain object properties.
my($self) = {};

#For now, we'll have one instance variable (property, whatever)
#It will be in the hash referenced by $self, and will have
#the index 'root'. This will be the first arg (inside the parentheses)
#of the call to the constructor in the main program.
$self->{'root'} = $_[1]; #remember $_[0] was the Tree before the ->

#There's nothing reserved about the word $self. It could have been
#called $oodolaboodola. To link the object with both the hash pointed
#to by $self and the type (Tree), we use the 2 argument version
#of the keyword bless:
bless($self, $type);

#Now finally, return the hash as a reference to be used as an "object"
return($self);
}


Ok, hier verstehe ich nicht, wozu man überhaupt einen Konstruktor braucht. Ist es nicht viel einfacher, einfach eine Funktion zu schreiben, die das gewünschte zurüchgibt? Und mal sehen ob ich das richtig verstanden habe: Es wird ein Hash erstellt, das dann Tree zugeordnet wird(wieso das eigentlich?) und dann wird es zurückgegeben.

Stimmt das so weit?
ich
 2005-09-14 01:53
#57878 #57878
User since
2003-09-19
120 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

kuck dir dazu mal am besten das hier an: http://perl-tutor.de/cgi-bin/perl_oo.pl

Bei Perl brauchst du einen Konstruktor um das Objekt zu erzeugen.
Und du brauchst einen Konstruktor um ein Objekt zu initialisieren (grundeinstellungen laden z.b.).

Gruss,
ich aka jan.
If you tell the truth you don't have to remember anything.
-- Mark Twain
Strazke
 2005-09-14 02:07
#57879 #57879
User since
2005-07-11
120 Artikel
BenutzerIn
[default_avatar]
Das ist jetzt schon mal verständlicher. Allerdings verstehe ich noch nicht, warum man nicht einfach eine Funktion macht, die "Hallo Welt" und umgedreht ausgibt. Warum alles als Klassen. Was bringt das?
Strazke
 2005-09-14 02:15
#57880 #57880
User since
2005-07-11
120 Artikel
BenutzerIn
[default_avatar]
Achja, und was ist, wenn ich in einem package ein anderes objekt aus einem anderem Modul erstellen will. Muss ich das use ... Dann in das Modul schreiben oder nur in das eigentliche Programm?
ich
 2005-09-14 02:24
#57881 #57881
User since
2003-09-19
120 Artikel
BenutzerIn
[Homepage] [default_avatar]
http://wiki.perl-community.de/bin/view/Wissensbasis/WasIstEinObjekt

Gruss,
ich aka Jan.

[edit]strat: url-tags hinzugefuegt[/edit]\n\n

<!--EDIT|Strat|1126690503-->
If you tell the truth you don't have to remember anything.
-- Mark Twain
Strazke
 2005-09-14 02:30
#57882 #57882
User since
2005-07-11
120 Artikel
BenutzerIn
[default_avatar]
also, jetzt die große Probe: kann ich es folgendermaßen schreiben(bzw kann ich etwas kürzen)?

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

use strict;
use DBI;

sub new {
my $class = shift;
my $self = {}
my $self->{db} = "mydatabase";
my $self->{host} = "localhost";
my $self->{user} = "root";
my $self->{dsn} = "DBI:mysql:$db:$host";
my $self->{attributes} = { PrintError => 0, RaiseError => 0 };
return bless $self, $class;}

sub add_user(){
my $self=shift;
my $self->{nickname} =$_[0];
my $self->{password} =$_[1];
my $self->{firstname} =$_[2];
my $self->{name} =$_[3];
my $self->{gender} =$_[4];
my $self->{birthdate} =$_[5];
my $self->{dbh} = DBI->connect($self->{dsn},$self->{user},undef,
$self->{attributes}) or
$self->WriteError('',"Error in connecting to $self->{dsn}", die => 1); )
$self->{nickname} = $dbh->quote($self->{nickname});
$slef->{password} = $dbh->quote($self->{password});}


Diese ganzen selfs sind ne Menge schreibarbeit ;)\n\n

<!--EDIT|Strazke|1126650883-->
renee
 2005-09-14 09:34
#57883 #57883
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Brauchst Du die Daten irgendwann nochmal in $self?? Nein, dann tut es auch:
Code: (dl )
1
2
3
4
5
6
7
8
9
subb add_user{
my ($self,@data) = @_;
my $i = 0;
for(qw/nickname password firstname name gender birthday/){
$self->{$_} = $dbh->quote($data[$i]);
++$i;
}
# connect;
}
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/
J-jayz-Z
 2005-09-14 12:44
#57884 #57884
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Strazke: ich hab mal ein kleines Modul für mich geschrieben, weil mir das mit dem DBI zuviel Tipparbeit war, vielleicht hilft dir das etwas: http://perl-tutor.de/mysql_easy.htm
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
pq
 2005-09-14 12:47
#57885 #57885
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=ich,13.09.2005, 23:53]kuck dir dazu mal am besten das hier an: http://perl-tutor.de/cgi-bin/perl_oo.pl[/quote]
naja...
http://wiki.perl-community.de/bin/view/Perldoc/perlobj finde ich besser
Quote
Bei Perl brauchst du einen Konstruktor um das Objekt zu erzeugen.

nein. du brauchst lediglich bless().
Quote
Und du brauchst einen Konstruktor um ein Objekt zu initialisieren (grundeinstellungen laden z.b.).

auch nicht. ich kann mir ohne einen konstruktor ein fertiges objekt erschaffen:
Code: (dl )
1
2
3
4
5
my $object = bless([
 "vorname",
 "nachname",
 4.4.1944,
], "Meine::Klasse");
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
J-jayz-Z
 2005-09-14 12:48
#57886 #57886
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Strazke,14.09.2005, 00:07]Allerdings verstehe ich noch nicht, warum man nicht einfach eine Funktion macht, die "Hallo Welt" und umgedreht ausgibt. Warum alles als Klassen. Was bringt das?[/quote]
Das war nur ein beispiel, um zu erläutern, wie man damit arbeitet. dazu reicht auch ein normales reverse("Hallo Welt"), da brauch man noch nicht mal ne Funktion zu schreiben. Aber bei übergroßen Quelltext, den brauch schon fast brauch, um OOP zu programmieren, wird so ein "Tutorial" unübersichtlich!
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
<< |< 1 2 3 >| >> 29 Einträge, 3 Seiten



View all threads created 2005-09-14 01:27.