Perl Hash von Arrays von Arrays
Ich habe einige Variablen in meinem Hash von mehrdimensionalen arrays verschwinden, sobald ich eine for-Schleife. Die Variablen werden korrekt gedruckt, einzeln in der Schleife, aber wenn ich drucken Sie ein beliebiges Element außerhalb der Schleife, es ist immer leer, außer für den ersten Punkt.
for my $y (0..$last_row - 2) {
my $mlid = $Sheet->Cells($y+2, 1)->{'Value'};
my @a = ();
$a[0] = $Sheet->Cells($y+2, 3)->{'Value'};
$a[1] = $Sheet->Cells($y+2, 4)->{'Value'};
$a[2] = $Sheet->Cells($y+2, 6)->{'Value'};
$a[3] = $Sheet->Cells($y+2, 7)->{'Value'};
$a[4] = $Sheet->Cells($y+2, 8)->{'Value'};
push @{$longHash{$mlid}}, [ @a ];
print "Item in Array in Hash: $longHash{$mlid}[1][0]\n"; #this prints nothing
if (exists $numPeople{$mlid}){
$numPeople{$mlid}++;
}else{
$numPeople{$mlid} = 0;
$numPeople{$mlid}++;
}
}
print "Item in Array in Hash: $longHash{7202}[0][0]\n"; #this prints properly
print "Item in Array in Hash: $longHash{7202}[1][0]\n"; #this prints nothing
Verhalten SOLLTE:
Habe ich einen hash. Der Schlüssel für eine einzelne mlid gibt ein array (für eine person).
In jedem array sollte es ein weiteres array, in dem die 0-4 Indizes werden aus einer Excel-Datei, die ich bin, zu Lesen.
So, um die Daten aus der mlid 7202, ab der 7. person und die 4. Spalte in Excel, ich sollte $longHash{7202}[7][1] (da erstellte ich mir die 4. Spalte der 1. Wert des Arrays.)
- Sie wurde nur der code, und jetzt
$y
ist nicht ein index in der hash. Können Sie bitte Kommentar und sagen, was das Verhalten sollte? Ich denke, alles, was Sie jetzt tun müssen ist, ändern$longHash{7202}[0][0]
zu$longHash{7202}[0]
. - Ändern
push @{$longHash{$mlid}}, [ @a ];
zu$longHash{$mlid} = [ @a ];
wenn Sie tun$longHash{7202}[0]
und nicht$longHash{7202}[0][0]
. - Aber ich brauche die zusätzlichen Informationen in 3 Stufen. MLID -, Person -, Person-Statistiken. Es gibt mehrere jeder und ich kann nicht loswerden, auch einem tier.
- OK, nur Kontrolle. Ich aktualisiert meine Antwort. Ich denke, dass Ihr code sollte jetzt arbeiten. Wenn nicht, versuchen Sie bitte meinem Beispiel und sehen, ob es funktioniert. Wenn es funktioniert, dann gibt es vielleicht ein anderes problem. Zum Beispiel, vielleicht gibt es nur eine person in
$mlid==7202
. Versuchen Sieuse strict; use warnings;
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie überschreiben
$longHash{$mlid}
in jeder iteration der Schleife, also im besten Fall$longHash{7202}[$x]
wird nur definiert werden, für die ein Wert von$x
.Es sei denn, Sie tun etwas, das viel komplizierter ist als das, was Sie hier zeigen, ich glaube nicht, dass Sie brauchen, um klar
$longHash{$mlid}
überhaupt. Sagenauto-wiederbeleben alles beiden
$longHash{key}
und$longhash{key}[index]
ohne die Notwendigkeit für pre-Initialisierung.(
$longHash{$mlid} = ()
sieht auch ein wenig seltsam -- bei der Zuweisung eine leere Liste zu einem Skalar-Variablen. Ich glaube nicht, dass es anders zu sagen$longHash{$mlid}=0
. Wenn Sie also, um es auf eine leere array-Referenz, dann sollten Sie[]
statt()
).Sehe ich zwei Probleme.
$longHash{$mlid} = ()
Sie versuchen, ein Skalares Feld, um eine Liste. {$mlid}` sollte eine Liste ref, nicht eine Liste. Die einfachste Lösung ist
$longHash{$mlid} = []
, aber das wird nicht das Problem lösen, das eigentliche Problem.2.
$longHash{$mlid}[$y] = [ @a ];
in Kombination mit$longHash{$mlid} = ();
Klärt
$longHash{$mlid}
bei jedem Durchgang durch die Schleife, dann versuchen zu ordnen, um einen nicht-null-index. Vielleicht das, was Sie hier wollen, ist ein hash-Wert hash statt eine hash-Liste.UPDATE
In deiner neuen version, ich denke
sollte nur
UPDATE 2
Ich denke, dass Ihr code sollte jetzt arbeiten.
Scheint es zu sein, entspricht meinem vereinfachten Beispiel unten:
UPDATE 3
Bitte fügen Sie
um sicherzustellen, dass alle array-Indizes, die Sie denken existieren, nicht existieren.
Und versuchen Sie Durchlaufen Ihre Daten, um es zu drucken, z.B.