Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7635[/thread]

Übergabe einer sort-Funktion an eine Methode: Problem beim Zugriff auf $a und $b (Seite 2)



<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
esskar
 2006-01-19 14:01
#62059 #62059
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=docsnyder,19.01.2006, 12:50]\() ist eine Referenz auf eine namenlose Liste.[/quote]
wie wäre es mit []
esskar
 2006-01-19 14:04
#62060 #62060
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
was ist mit der sub name

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub new {
my ($class, $name) = (shift, shift);
my $self = {};

$self->{childs} = [];
$self->{name} = $name;
$self->{parent} = undef;

return bless $self, $class;
}

sub name {
return shift->{name};
}
Crian
 2006-01-19 14:06
#62061 #62061
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=docsnyder,19.01.2006, 12:50]\() ist eine Referenz auf eine namenlose Liste.[/quote]
aha, wieder was gelernt... ich nehm - wie esskar - immer []

@esskar: oder so

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub new {
my ($class, $name) = (shift, shift);
my $self = {
childs => [],
name => $name,
parent => undef,
};

return bless $self, $class;
}

sub name {
return shift->{name};
}
\n\n

<!--EDIT|Crian|1137672495-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
docsnyder
 2006-01-19 15:03
#62062 #62062
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@esskar

Du hast doch bestimmt eine Mail-Adresse, wo ich Anhänge hinschicken kann. Ich würde Dir gerne mal den kompletten Code zuschicken. (Ich habe alles unnötige herausgeschmissen und eine Minimal-Version gebastelt, ist also nicht allzuviel Code)

Wenn ich in der Compare-Funktion
Code: (dl )
printf("REF: %s / %s\n", ref($_[0]), ref($_[1]));

ausführe, bekomme ich folgendes heraus:

Code: (dl )
1
2
3
REF: myClass / CODE
REF: myClass / CODE
REF: myClass / CODE


Das sollte doch beide Male "myClass" sein.

Verwende ich dagegen $a und $b, bekomme ich wieder folgenden Fehler:

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


Gruß, Doc
esskar
 2006-01-19 15:33
#62063 #62063
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
info _äd_ intertivity _dod_ com

kannst den code aber auch hier posten!
Crian
 2006-01-19 15:40
#62064 #62064
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Wär schön, wenn man den Code erfolgreich ans Posting anhängen könnte... zumal das Code-Tag immer noch whitespaces frisst.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
docsnyder
 2006-01-19 15:44
#62065 #62065
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also gut, auf daß das mit Cut&Paste gutgeht.

File myClass.pm:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/bin/perl

package myClass;

use strict;
use warnings;
use vars qw($VERSION);
$VERSION = '0.01';

#----------------------------- new() -----------------------------------------#
sub new {
my($class) = shift;
my($name) = shift;
my($self) = {};

$self->{childs} = [];
$self->{name} = $name;
$self->{parent} = undef;

return(bless($self, $class));
}

#---------------------------- sort() -----------------------------------------#
sub sort {
my($self, $sortFunc) = @_;
my($nodeObj);
my(@tmpArr);

if ( scalar(@tmpArr=$self->childList()) ) {
if ( $sortFunc ) {
@tmpArr = sort $sortFunc @tmpArr;
}
else {
@tmpArr = sort(@tmpArr);
}

$self->{childs} = \@tmpArr;

for $nodeObj ( @tmpArr ) {
$nodeObj->sort($sortFunc);
}
}
}

#----------------------------- name() ----------------------------------------#
sub name {
my($self) = @_;

return($self->{name});
}

#----------------------------- childList() -----------------------------------#
sub childList {
my($self) = @_;

if ( defined($self->{childs}) ) {
return(@{$self->{childs}});
}
else {
return(());
}
}

#----------------------------- addChild() ------------------------------------#
sub addChild {
my($self, $childObj, $idx) = @_;

if ( ($idx == -1) || ($idx >= scalar(@{$self->{childs}})) ) {
push(@{$self->{childs}}, $childObj);
}
else {
my(@tmpArr) = @{$self->{childs}};
@tmpArr = ( @tmpArr[0..($idx-1)], $childObj, @tmpArr[$idx..(scalar(@tmpArr)-1)] );
$self->{childs} = \@tmpArr;
}

$childObj->{parent} = $self;
}

1;


File myClass.pl
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
29
30
31
#!/bin/perl

use myClass;

@childObjs = ();

#---------------------------- sortNodes() ------------------------------------#
sub sortNodes {
printf("REF: %s / %s\n", ref($_[0]), ref($_[1]));
# $_[0]->name() cmp $_[1]->name();
# $a->name() cmp $b->name();
1
}

#--- CREATING TREE OBJECT ----------------------------------------------------#
$treeObj = new myClass("ROOT");

#--- CREATING CHILDS ! -------------------------------------------------------#
for ( $idx=0; $idx<5; $idx++ ) {
push(@childObjs, new myClass("CHILD_$idx"));
}

#--- ADD CHILDS ! ------------------------------------------------------------#
$treeObj->addChild($childObjs[0], -1);
$treeObj->addChild($childObjs[1], -1);
$childObjs[1]->addChild($childObjs[2], -1);
$treeObj->addChild($childObjs[3], 1);
$childObjs[1]->addChild($childObjs[4], -1);

#--- sort tree ! -------------------------------------------------------------#
$treeObj->sort(\&sortNodes);


Wär echt nett, wenn Du's Dir mal anschauen könntest.

Gruß, Doc
Taulmarill
 2006-01-19 17:00
#62066 #62066
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wie schon weiter oben erwähnt, musst du eine subroutine mit prototyp definieren, wenn du eine aus einem anderen package verwenden willst. die würde dann also so aussehen:
Code: (dl )
1
2
3
4
sub sortNodes ($$) {
# printf( "REF: %s / %s\n", ref($_[0]), ref($_[1]) );
$_[0]->name() cmp $_[1]->name();
}

ausserdem würde ich dir dringen davon abraten, subroutinen mit reservierten worten (funktionen, operatoren, etc.) zu benennen, das verwirrt nur unnötig.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
docsnyder
 2006-01-19 17:07
#62067 #62067
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Taulmarill

Tausend Dank für den Tipp: mit Prototyp funzt es!

@esskar

Bitte keine Mühe mehr machen, Problem ist gelöst.

Gruß, Doc
pq
 2006-01-19 19:05
#62068 #62068
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=docsnyder,19.01.2006, 12:50]\() ist eine Referenz auf eine namenlose Liste.[/quote]
falsch.
Code: (dl )
1
2
3
4
5
6
7
8
perl -wle'use Data::Dumper;
$a = \();
print Dumper $a;
@a = \();
print scalar @a'
$VAR1 = \undef;

0

\() ist also im skalaren kontext eine referenz auf undef, und im listen-
kontext (was in einer hash-deklaration der fall ist) einfach eine leere
liste (weil \($a,$b) äquivalent zu (\$a, \$b) ist.
der kontext wird also vor der referenzierung ausgewertet.

dein code macht nicht, was du denkst.
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
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2006-01-19 11:16.