Es ist ein offensichtliches Problem hier, aber es wäre nicht das Verhalten verursachen, die Sie sehen.
Sie denken, dass Sie eine Hash-Referenz in $HashVariable
haben, und das klingt richtig, wenn Sie die HASH(0xd1007d0)
Ausgabe, die Sie beim Drucken sehen, sehen.
Aber eine Hash-Referenz Einrichten und Ausführen von Code, gibt etwas seltsame Ergebnisse:
my $HashVariable = {
foo => 1,
bar => 2,
baz => 3,
};
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable{$var}\n";
}
Der Ausgang ich erhalte, ist:
In the loop
baz and
In the loop
bar and
In the loop
foo and
Beachten Sie, dass die Werte nicht ausgedruckt werden . Das liegt an dem oben erwähnten Problem. Hinzufügen von use strict
zu dem Programm (was Sie immer tun sollten) sagt uns, was das Problem ist.
Global symbol "%HashVariable" requires explicit package name (did you forget to declare "my %HashVariable"?) at hash line 14.
Execution of hash aborted due to compilation errors.
Sie verwenden $HashVariable{$var}
einen Schlüssel in der Hash zu suchen. Das wäre richtig, wenn Sie einen Hash haben %HashVariable
genannt, aber Sie nicht - Sie haben einen Hashreferenz $HashVariable
(man beachte die $
statt %
) genannt. Um einen Schlüssel aus einer Hash-Referenz nachzuschlagen, müssen Sie einen Dereferenzierungspfeil verwenden - $HashVariable->{$var}
.
Behebung, dass Ihr Programm wie erwartet funktioniert.
use strict;
use warnings;
my $HashVariable = {
foo => 1,
bar => 2,
baz => 3,
};
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable->{$var}\n";
}
Und ich sehe:
In the loop
bar and 2
In the loop
foo and 1
In the loop
baz and 3
Der einzige Weg, dass Sie die Ergebnisse, die Sie (die HASH(0xd1007d0)
Ausgang aber keine Iterationen der Schleife) beschreiben bekommen könnte, ist, wenn Sie einen Hashreferenz aber den Hash haben hat keine Schlüssel.
Also (wie ich in einem Kommentar gesagt) müssen wir sehen, wie Ihre Hash-Referenz erstellt wird.
Sie beziehen sich auf die Hashes in Skalar? – ssr1012
Wenn die Variable '$ HashVariable 'tatsächlich ein Hashref ist, ist die einzige Möglichkeit, dass sie leer ist, ohne irgendwelche Schlüssel. Sonst würde der Code in die Schleife kommen. – zdim
Könnten Sie bitte teilen Sie den Hash, wo es von – ssr1012