Thread each-operator reseten? (12 answers)
Opened by supersucker at 2005-04-30 17:57

supersucker
 2005-04-30 17:57
#54333 #54333
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
hi,

hab einen hash der als schlüssel integer zahlen enthält und als value
wieder einen hash mit (unter anderem) float-zahlen.
nun möchte ich mir aus dem hash die 10 einträge mit den höchsten values rausholen, dies mach ich auf folgende (zugegebenermaßen ziemlich naive) art:

ich durchlaufe den kompletten hash, hol mir das element mit dem höchsten wert, pushe das auf ein array, und lösche das entsprechende hash-element, und das eben 10 mal.

dazu folgender code:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for my $i (1..$numberOfBestFrags)
{
our $index = 0;
our $maxGoodness = 0;

while(($key, $value) = each %fragmentResultSetH)
{
if($value{goodness} > $maxGoodness)
{
$maxGoodness = $value{goodness};
$index = $key;
} &nbsp
;
}
push @tenBestFrags, $fragmentResultSetH{"$index"};
delete $fragmentResultSetH{"$index"};
}


merkwürdigerweise klappt dies nun nur im ersten durchlauf der for-schleife, laufe ich das zweite, dritte usw. mal drüber, krieg ich immer folgende fehlermeldung:

Code: (dl )
Use of uninitialized value in numeric gt (>) at /root/development/eclipse/eclipse/workspace/PDB_FRAGMENT_LIB/bin/PDBQuery.pl line 436, <FILE> line 13484.


versteh ich nicht, weil wenn ich in der for-schleife folgende print-anweisungen einfüge:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
for my $i (1..$numberOfBestFrags)
{
print "for loop nr. $i \n";
my $nrOfKeys = scalar keys %fragmentResultSetH;
print "nr of keys = $nrOfKeys \n";
my $nrOfvalues = scalar values %fragmentResultSetH;
print "nr of values = $nrOfvalues \n";

....rest vom code wie oben........

}


dann sehe ich dass der code beim ersten durchlauf das tut was er soll, nämlich das grösste element (bzw. der hash mit dem grössten element) wird auf ein array gepusht und anschliessend aus dem hash entfernt...

bei jedem weiteren durchlauf der for-schleife jedoch bleibt die anzahl der keys und der values genau der gleiche, das sieht bei mir in der ausgabe z.B. so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for loop nr. 1
nr of keys = 35
nr of values = 35

for loop nr. 2
nr of keys = 34
nr of values = 34

for loop nr. 3
nr of keys = 34
nr of values = 34

for loop nr. 4
nr of keys = 34
nr of values = 34

usw....


und ich erhalte ab dem zweiten for-durchlauf obigen erwähnten fehler, dass ich in dem grösser-vergleich einen undefinierten wert verwende...

woran kann das denn liegen? für mich sieht der code soweit ok aus, deswegen hab ich drauf getippt, dass vielleicht der each-operator nicht reseted wird...

im kamel-buch von larry wall steht aber dazu:

Quote
Der each-operator kann zurückgesetzt werden, indem alle Elemente im Hash gelesen werden oder indem man keys %hash oder values %hash evaluiert.


ich dachte genau das würde ich tun.......
oder liegt der fehler ganz woanders?

danke im voraus für jede hilfe...

View full thread each-operator reseten?