Schrift
[thread]10425[/thread]

Perl für Anfänger!



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Togad
 2007-09-20 12:00
#99719 #99719
User since
2007-09-20
21 Artikel
BenutzerIn
[default_avatar]
Hi ich habe hier ein Programm, dass ich nicht ganz verstehe.
Ich habe vorallem Probleme mit diesem hier:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Usage: my $logfile = $handler->conf( 'LogFile' ); # return value
#    or: $handler->conf( 'LogFile' => $myLogfile ); # set    value
sub conf {
    my ( $self, $option, @params ) = @_;

    if ( scalar @params ) {    # if parameter submitted, set it
        $self->{CONFIG}->{$option} = $params[0];
    } # if

    unless ( exists $self->{CONFIG}->{$option} ) {
        Carp::croak "Error: \$handler->conf($option) not existing";
    } # unless

    return $self->{CONFIG}->{$option};
} # conf


Kann mir das einer so erklären das sogar ich das verstehe???
Vorallem wüsste ich gerne was $self->{CONFIG}->{$option} = $params[0]; ist. Ein Objekt? Referenz? Was anderes???

Danke schonmal für die Antworten.

MFG Togad


edit pq: perl-tags hinzugefügt
Taulmarill
 2007-09-20 12:16
#99720 #99720
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
1. Benutze das "code" oder "perl" Tag um deinen Quellcode lesbarer zu machen.

2. Objekte sind Referenzen :-)

Das Programm was du da hast sieht aus, als währe es Teil eines Objektorientierten Moduls. Bei $self handelt es sich tatsächlich um das Objekt, welches die Funktion (in diesem Fall conf) aufgerufen hat. Objekte in Perl sind Referenzen, die mit einem Package verknüpft sind. In diesem Fall zeigt die Referenz auf einen Hash, was auch der Normalfall bei Objekten ist. Es gibt aber auch Objekte, die ganz bewusst auf einen Array oder einen Scalar zeigen. Die Pfeile nach dem $self dereferenzieren die Referenz, so dass man auf die Werte des eigentlichen Hashs zugreifen kann.

Ansonsten hört sich das für mich so an, als solltest du dir mal das eine oder andere gute Perlbuch zu Gemüte führen. Im Wiki haben wir Buchvorschläge gesammelt.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Struppi
 2007-09-20 12:16
#99721 #99721
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
$self ist ein Skalar, der für das Objekt steht in dessem Kontext die Funktion aufgerufen wurde.
$self ->{CONFIG} ist eine Hash Referenz in dem Objekt.
$self ->{CONFIG}->{$option} $option ist wohl ein String, der den Namen eines Wertes der Hash Referenz bezeichnet. Und diesem wert wird der zweite Parameter ($params[0], der erste Parameter der Funktion ist $option [Genaugenommen $self, aber das ist ein anderes Thema]) zugewiesen.
Togad
 2007-09-20 12:26
#99722 #99722
User since
2007-09-20
21 Artikel
BenutzerIn
[default_avatar]
Aufgerufen wird es mit

$handler->conf("XYZ")

was wird dann bei return zurück gegeben?

ich habe doch nur einen Parameter, also doch nur $self oder??

was bringt mir das ganze??
nepos
 2007-09-20 12:44
#99723 #99723
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Zurückgegeben wird der Wert, der unter
Code (perl): (dl )
$self->{CONFIG}->{$option}
steht.
$self ist dabei wieder die Referenz des Objektes, das in deinem Fall aus einem Hash besteht.
CONFIG ist ein Key für diesen Hash und enthält auch wieder einen Hash (genauer gesagt, eine Hash-Referenz). Von diesem 2. Hash wird dann der Wert für den Key $option zurückgegeben.

Worum es sich dabei handelt kann man so nicht sagen. Wen du die Funktion so aufrufst
Code (perl): (dl )
$handler->conf('XYZ', 'Das ist der Wert');

dann kriegst du bei deinem Aufruf den String 'Das ist der Wert zurück'. Je nachdem, was du bei dem Aufruf mit 2 Parametern übergibst, kann es halt auch eine Array-Referenz, eine Hash-Referenz, ein Objekt oder sogar eine Referenz auf eine Funktion sein.

Wenn du dir die Internas solcher Objekte ansehen willst, dann schau dir mal CPAN:Data::Dumper an. Damit kann man sich verschachtelte Strukturen ausgeben lassen. Ist oft ganz praktisch zum Debuggen.
Togad
 2007-09-20 12:54
#99724 #99724
User since
2007-09-20
21 Artikel
BenutzerIn
[default_avatar]
Ich habe auch schon überlegt ob ich mir das nicht mal einfach ausgeben lasse, mit Data::Dumper zum Beispiel.
Doch mein Problem ist das das Programm ziemlich groß ist (zumindest finde ich das als Anfänger so. Hauptprogramm 2000 Zeilen und 4 Module mit 300-600 Zeilen).

Ich weiss also nicht was ich da alles ändern muss um das Programm mir nur anzuschauen, ohne es wirklich auszuführen und nachher etwas kaputt zu machen. Eigentlich denke ich mal das hier nicht so viel passiert wenn ich es laufen lasse, aber da ich noch überhaupt keinen durchblick habe und es sich um ein BAckup handelt was ein paar Stunden läuft ist das mit dem Debugg nicht so einfach.

kann ich das noch anders zurück verfolgen, was in $self->{CONFIG}->{$option} steht? ich meine §self sollte ja "XYZ" sein aber wie komme ich jetzt weiter? was heisst das XYZ->{CONFIG} ? wo suche ich weiter? Ich "arbeite" gerade mal 3 Wochen mit Perl und eigentlich habe ich mir bisher nur die beiden Kurse von fabiani.net angeguckt. mir fehlt also jegliche praxis.
Togad
 2007-09-20 13:01
#99725 #99725
User since
2007-09-20
21 Artikel
BenutzerIn
[default_avatar]
Taulmarill+2007-09-20 10:16:37--
1. Benutze das "code" oder "perl" Tag um deinen Quellcode lesbarer zu machen.


?

wie mache ich das? so ählich wie mir Perl Tidy?
renee
 2007-09-20 13:03
#99726 #99726
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[nop]
Code: (dl )
etwas code
[/nop] bzw. [nop]
Code (perl): (dl )
perl-code
[/nop]
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/
renee
 2007-09-20 13:11
#99727 #99727
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
XYZ steht in $option, nicht in $self. In $self ist das Objekt...

$self ist eine geblesste Hashreferenz - aber immer noch eine Hashreferenz.

Wenn Du also
Code (perl): (dl )
$handler->conf('XYZ', 'Das ist der Wert');
aufrufst, dann wird steht das Objekt in $self, XYZ in $option und 'Das ist der Wert' in @params (bzw. in $params[0]).

Dann wird $params[0] als Wert für den Schlüssel 'XYZ' in der Hashreferenz gespeichert, die zu dem Schlüssel 'OPTION' im Objekt gehört.

Vielleicht verstehst Du es mit diesem Demoskript besser:

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

use strict;
use warnings;
use Data::Dumper;

# erzeuge eine Hashreferenz (simuliert das Objekt)
my $self = {};

# simuliere $handler->conf('XYZ','Wert');
my $value = conf($self,'XYZ','Wert');
print $value;

sub conf {
    my ( $self, $option, @params ) = @_;
    print Dumper $self;

    if ( scalar @params ) { # if parameter submitted, set it
        $self->{CONFIG}->{$option} = $params[0];
    } # if

    print Dumper $self;

    unless ( exists $self->{CONFIG}->{$option} ) {
        Carp::croak "Error: \$handler->conf($option) not existing";
    } # unless

    return $self->{CONFIG}->{$option};
} # conf
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/
Togad
 2007-09-20 13:32
#99728 #99728
User since
2007-09-20
21 Artikel
BenutzerIn
[default_avatar]
ja ist ja alles ganz schön, aber wenn ich einen zweiten Parameter Übergebe, "setzte" ich den Wert ja. doch in meinem Fall lese ich ihn ja aus. (zumindest glaube ich das)

wie aber wird der Wert gesetzt?? muss ich dazu irgendwo

$handler->conf("XYZ", "WERT")

haben? Ich habe gerade danach gesucht aber ich kann nichts finden.

Kann man den Wert noch irgendwie anders setzen?






Und wie kann ich den Perl Code hier so schon bunt einpflegen?? wie ihr das macht??
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-09-20 12:00.