Schrift
[thread]7161[/thread]

Problem mit "Klasse" und Array Übergabe

Leser: 1


<< >> 7 Einträge, 1 Seite
FX
 2005-07-26 13:26
#56692 #56692
User since
2005-07-23
4 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich möchte einer Klasse einen Array übergeben der als Inhalt Adressen von Funktionen hat.

Übergabeparamter:
Code: (dl )
1
2
my $menuMain=menuClass->new();
$menuMain->InitMenuFunc (\&main::Test0, \&main::Test1);



Nur die Übergabe des Arrays funktioniert nicht, weder so:
Code: (dl )
1
2
3
4
5
6
7
8
9
sub InitMenuFunc {
    my $self=shift;
    # print "self: " . $self . "\n";
    my $idx = 0;
    foreach my $element ( @_ ) {
        $self->{$menuFunc[$idx]} = $element;
        $idx++;
    }
}

noch so:
Code: (dl )
1
2
3
4
sub InitMenuFunc {
    my $self=shift;
       self->{@menuFunc} = @_;
}



Der Aufruf der Funktionen, funktioniert auch nur über Umwegen über &$ref, kann ich die Funktion nicht direkt ausführen?:
Code: (dl )
1
2
3
    my $ref = $self->{$menuFunc[0]};
    print "ref: " . $ref . "\n";
    &$ref;


Grüße
Markus\n\n

<!--EDIT|FX|1122371472-->
Ronnie
 2005-07-26 13:40
#56693 #56693
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
$ref->() ist auch 'ne Möglichkeit.

UPDATE: Typo gefixt. Danke an pq!\n\n

<!--EDIT|Ronnie|1122376914-->
frodus
 2005-07-26 13:44
#56694 #56694
User since
2003-09-26
147 Artikel
BenutzerIn
[default_avatar]
Hi,

Ist zwar nicht getested aber ich wuerde es so versuchen:
Code: (dl )
1
2
3
4
5
6
7
8
9
sub InitMenuFunc {
my $self=shift;
# print "self: " . $self . "\n";
my $idx = 0;
foreach my $element ( @_ ) {
$self->{menuFunc}->[$idx] = $element;
$idx++;
}
}


oder so:

Code: (dl )
1
2
3
4
sub InitMenuFunc {
my $self=shift;
@{$self->{menuFunc}} = @_;
}


Gruss,

Frodus

Edit: Sollte eigentlich so aussehen! ;-)\n\n

<!--EDIT|frodus|1122371176-->
pq
 2005-07-26 14:53
#56695 #56695
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Ronnie,26.07.2005, 11:40]$ref() ist auch 'ne Möglichkeit.[/quote]
was soll das denn sein?

anonyme funktionen rufe ich immer mit $ref->() auf, finde ich am schönsten.
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
FX
 2005-07-26 15:03
#56696 #56696
User since
2005-07-23
4 Artikel
BenutzerIn
[default_avatar]
Danke für die Antworten. So wie es frodus vorgeschlagen hat, funktioniert es:

Initialisieren:
Code: (dl )
1
2
3
4
sub InitMenuLines {
my $self=shift;
@{$self->{menuLines}} = @_;
}


Ausgabe hab ich jetzt folgendendermassen gelöst um auf die &$ref zu verzichten:
Code: (dl )
1
2
3
4
5
6
7
sub GetMenuLines {
my $self = shift;
my $idxFunc = shift;
# my $ref = $self->{menuFunc}->[$idxFunc];
# &$ref;
&{$self->{menuFunc}->[$idxFunc]};
}


Vielleicht kann mir die Zeile noch jemand kurz erklären:
Code: (dl )
@{$self->{menuLines}} = @_;



Grüße
Markus
frodus
 2005-07-26 15:28
#56697 #56697
User since
2003-09-26
147 Artikel
BenutzerIn
[default_avatar]
[quote=FX,26.07.2005, 13:03]Danke für die Antworten. So wie es frodus vorgeschlagen hat, funktioniert es:

Initialisieren:
Code: (dl )
1
2
3
4
sub InitMenuLines {
my $self=shift;
@{$self->{menuLines}} = @_;
}


Ausgabe hab ich jetzt folgendendermassen gelöst um auf die &$ref zu verzichten:
Code: (dl )
1
2
3
4
5
6
7
sub GetMenuLines {
my $self = shift;
my $idxFunc = shift;
# my $ref = $self->{menuFunc}->[$idxFunc];
# &$ref;
&{$self->{menuFunc}->[$idxFunc]};
}


Vielleicht kann mir die Zeile noch jemand kurz erklären:
Code: (dl )
@{$self->{menuLines}} = @_;



Grüße
Markus[/quote]
Hi,

Code: (dl )
@{$self->{menuLines}} = @_;


Da es sich bei $self->{menuLines} um eine referenz auf ein
anonymes Array handelt muss du es erst durch @{} dereferenzieren bevor
du es zuweisen kannst.

Solche zusammenhänge sieht man eigentlich immer ganz schon wenn man
$self mit dem Data::Dumper ausgeben lässt.

Gruss,

Frodus

P.S.: perldoc Data::Dumper
renee
 2005-07-26 15:40
#56698 #56698
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
und siehe Wiki:perlreftut (sogar deutsch)\n\n

<!--EDIT|renee|1122378094-->
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/
<< >> 7 Einträge, 1 Seite



View all threads created 2005-07-26 13:26.