2012-03-28 10 views
1

I mit dem folgenden Inhalt eine Hash-Tabelle habe:Schleife durch ein aus einer Hash-Tabelle abgerufen Array

my %hash = (
    'a' => 1, 
    'b' => 2, 
    'c' => [3, 4, 5], 
); 

Und später bin ich in $hash{'c'}@array_c als Teil Funktion des Abrufens wie Ziehen:

sub getVar { 
    my $id = shift; 
    return $hash{$id}; 
} 

my @array_c = getVar('c'); 

Dann später ich durch @array_c Schleife bin versucht, und jede Zeile drucken:

foreach (@array_c){ 
    print "$_"; 
} 

jedoch statt der gewünschten Ausgabe von 345, erhalte ich ARRAY(0x100804ed0)

Hilfe Bitte: D

EDIT:

Wenn ich print @array_c[0]->[0] tun dann bekomme ich 3, so dass ich denke, ich bin ein wenig verwirrt wie ich es geschafft habe, ein verschachteltes Array zu erstellen.

GELÖST:

Went mit deferencing das Array:

my @array_c = @{getVar('c')}; 

Antwort

2

Die sub getVar Gibt eine refrence auf ein Array, nur dereferenzieren:

my @array_c = @{getVar('c')}; 

oder die Unter ändern:

sub getVar { 
    my $id = shift; 
    return @{$hash{$id}}; 
} 
+0

Erste Antwort und 1 Zeilenwechsel: D Danke! – DanH

+0

@DanH: Gern geschehen. – Toto

1

[3, 4, 5] ist ein Arrayref, kein Array. Ändern Sie den Code entsprechend:

my $c_arrayref = getVar('c'); 

foreach (@{ $c_arrayref }) { 

Lesen perlreftut und perlref.

1

verwenden einfach die Array-Referenz als eine Referenz:

my $array_c = getVar('c'); 
... 
foreach (@$array_c){ 
    print "$_"; 
} 

Oder dereferenzieren der Array-Referenz in dem Hash gespeichert, entweder in getVar:

sub getVar { 
    my $id = shift; 
    return @{ $hash{$id} }; 
} 

oder ihren Aufrufer:

my @array_c = @{ getVar('c') }; 
0

Ein Mehrzweckrücklauf für Ihre getVar

return wantarray ? map { ref() eq 'ARRAY' ? @$_ : $_ } $hash{ $id } 
    :    $hash{ $id } 
    ;