Thread Übergabe einer sort-Funktion an eine Methode: Problem beim Zugriff auf $a und $b (23 answers)
Opened by docsnyder at 2006-01-19 11:16

docsnyder
 2006-01-19 11:16
#62049 #62049
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo!

Ich habe folgendes Problem mit dem Aufruf einer eigenen Sort-Funktion an eine Methode einer Klasse.

Um zu verdeutlichen, worum es genau geht, hier zunächst ein Beispiel zur Vorgehensweise "ohne" daß eine Klasse im Spiel ist:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub myCmp {
$a cmp $b;
}

sub myFunc {
my($sortFunc, @arr) = @_;

# do something ...

@arr = sort $sortFunc @arr;

# do something else ...

return(@arr);
}

@tmpArr = ( "xxx", "aaa", "zzz", "bbb" );
@tmpArr = myFunc(\&myCmp, @tmpArr);


Wenn ich nun myFunc() zu einer Methode einer Klasse mache (sagen wir myMethod()), und wenn die zu vergleichenden Werte $a und $b jetzt Objekte (mit einer Methode name()) sind (übergeben wird an sort() ein Array mit Objekten), scheint das nicht mehr zu funktionieren:

Code: (dl )
1
2
3
4
5
6
7
sub myCmp {
$a->name() cmp $b->name();
}

@tmpArr = ( $obj_1, $obj_2, $obj_3 );

$someObj->myMethod(\&myCmp, @tmpArr);


Wird jetzt in myMethod() die Sort-Funktion myCmp() aufgerufen und das Array übergeben, kann die Methode name() nicht mehr für $a bzw. $b aufgerufen werden. Ich bekomme den Fehler

Code: (dl )
Can't call method "name" on an undefined value at ./usTree.pl line ...


Und in der Tat, wenn ich myCmp() wie folgt definiere:

sub myCmp {
print("comparing '$a' and '$b' ...\n");
$a cmp $b;
}

bekomme ich die folgende Ausgabe:

Code: (dl )
comparing '' and '' ...


In myMethod() kann ich für jedes Array-Element, das an sort() übergeben wird, die Methode name() aufrufen und bekomme ein sinnvolles Ergebnis, das Array ist also nicht leer, wie es die Fehlermeldung vermuten läßt.

Was läuft hier falsch?

Gruß, Doc

View full thread Übergabe einer sort-Funktion an eine Methode: Problem beim Zugriff auf $a und $b