2017-05-03 3 views
0

Wenn ich eine Variable drucke, erhalte ich einen HASH(0xd1007d0) Wert. Ich muss die Werte aller Schlüssel und Werte drucken. Allerdings kann ich das nicht, da die Kontrolle nicht in die Schleife geht.Drucken Hash-Wert in Perl

foreach my $var(keys %{$HashVariable}){ 
    print"In the loop \n"; 
    print"$var and $HashVariable{$var}\n"; 

} 

Aber die Steuerung tritt nicht einmal in die Schleife ein. Ich bin neu in Perl.

+0

Sie beziehen sich auf die Hashes in Skalar? – ssr1012

+2

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

+1

Könnten Sie bitte teilen Sie den Hash, wo es von – ssr1012

Antwort

2

Ich kann nicht vollständig antworten, weil es ganz davon abhängt, was in $HashVariable ist.

Der einfachste Weg, zu sagen, was ist da drin ist:

use Data::Dumper; 
print Dumper $HashVariable; 

dies Angenommen ist ein Hash Referenz - was es wäre, wenn print $HashVariableHASH(0xdeadbeef) als Ausgang gibt.

Also das sollte Arbeit:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $HashVariable = { somekey => 'somevalue' }; 

foreach my $key (keys %$HashVariable) { 
    print $key, " => ", $HashVariable->{$key},"\n"; 
} 

Der einzige Fehler Sie machen, ist, dass $HashVariable{$key} wird nicht funktionieren - Sie dereferenzieren müssen, weil, wie es steht, es zu %HashVariable nicht $HashVariable bezieht, das sind zwei völlig verschiedene Dinge.

Andernfalls - wenn es nicht die Schleife eintritt - es kann bedeuten, dass keys %$HashVariable nichts zurückkehr. Welches ist, warum dass Dumper Test sinnvoll wäre - ist es eine Chance, die Sie entweder nicht richtig bevölkern, oder du bist -%HashVariable Schreiben statt.

Z. B .:

my %HashVariable; 
$HashVariable{'test'} = "foo"; 
1

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.

Verwandte Themen