/ / How to iterieren durch Array of Hashes in einem Hash in Perl - Perl, Hash

Wie man Array of Hashes in einem Hash in Perl - perl, hash iteriert

Ich habe ein Array von Hashes in einem Hash, das folgendermaßen aussieht:

$var  = {
"items" => [
{
"name"  => "name1",
"type"  => "type1",
"width" => "width1",
},
{
"name"  => "name2",
"type"  => "type2",
"width" => "width2",
},
{
"name"  => "name3",
"type"  => "type3",
"width" => "width3",
}
]
};

Ich habe den folgenden Code geschrieben, um die Werte aus einer Datei zu erhalten.

my @members = ("name"    =>  $name,
"type"    =>  $type,
"width"   =>  $width);

$rec->{$items} = [ @members ];

push @var, $rec;

Ich bin nicht sicher, wie die Werte aus dieser Datenstruktur abgerufen werden.

Ich habe die Lösung gesehen Iterate durch Array of Hashes in einem Hash in Perl. Aber ich habe es nicht verstanden. Ich bin nicht sicher, was $ filelist war, das sie im Code erwähnt hatten.

foreach my $file (@{ $filelist{file} }) {
print "path: $file->{pathname}; size: $file->{size}; ...n";
}

Ich bin neu in Perl und bitte geben Sie mir Details in Ihrer Antwort.

Antworten:

2 für die Antwort № 1

Eine hervorragende Referenz für Datenstrukturen wie die, mit denen Sie sich beschäftigen, ist Perls Data Structures Kochbuch.

Das heißt, hier ist der Code:

for my $item (@{$aoh->{items}}) {
# "@" casts the $aoh->{items} hash references to an array
print $item->{name};
}

1 für die Antwort № 2

Vor allem die Struktur darin Frage mögen

$VAR1 = {
"file" => [
{
"pathname" => "./out.log",
"size" => "51",
"name" => "out.log",
"time" => "1345799296"
},
.
.
.
}

ist eigentlich Ausdruck oder Ausgabe des Hashref $filelist. Data::Dumper Modul, das beim Drucken der Strukturen wie hashref, arrayref, etc. in einer Weise hilft, die Sie richtig lesen können.

Damit $VAR1 ist nichts anderes $filelist gedruckt mit Dumper.

Nun, über die foreach-Schleife, die durch Werte iteriert:

foreach my $file (@{ $filelist{file} })

Hier das $filelist{file} Teil gibt die Array-Referenz zurück (Hinweis: [, ] repräsentiert arrayref).

Jetzt, wenn Sie verwenden @{} auf dieser Arrayref, d.h. @{ $filelist{file} }, dies konvertiert oder erweitert sich als Array.

Sobald wir die arrayref in den Array-Typ konvertiert haben, können wir mit iterieren foreach.

Bitte beachten Sie, dass wenn Sie verwenden $hashrefname->{$key}bedeutet es, dass hashref auf den Schlüssel zugreift, $hashname{$key} bedeutet Hash-Zugriffsschlüssel. Das Gleiche gilt für Arrayef und Array, aber anstelle von Schlüsseln gibt es Nummern, auf die im Falle eines Arrays zugegriffen werden kann.

Lösung für Ihr Problem:

Sie müssen die Mitglieder als Hashref und nicht als Array speichern, d. H.

my $member = {"name"    =>  $name,
"type"    =>  $type,
"width"   =>  $width};

Dann können Sie jeden Hash-Verweis, den Sie aus der Datei gelesen haben, drücken (ich vermute, dass es aus der Datei stammt) in das Array

push @arr, $member

Und weisen Sie dann den Elementen die arrayref zu

$rec->{items} = @arr

Jetzt können Sie auf Werte wie zugreifen

foreach my $eachhashref (@{$rec->{items}})
{
print $eachhashref->{name}
}