2 Stimmen

Iterieren über eine komplexe Datenstruktur

Ich habe anscheinend eine Menge eines Arrays von Hashes. Ich versuche, einige Werte herauszuziehen und stecke fest (das ist viel tiefer, als ich mit einer Struktur gehen würde. Es sieht so aus.....

%htest = (
  8569 => {
    4587 => [
           {
            date=> "2011-01-15",
            approved=> 1,
           },
           { 
            date=> "2011-01-12",
            approved=> 1,
           },
           ],
    1254 => [
           {
            date=> "2011-01-12",
            approved=> "",
           },
           { 
            date=> "",
            approved=> 1,
           },
           ],
        },
);

Der Versuch, über dieses Ding zu iterieren, bereitet mir massive Kopfschmerzen. Ich versuche auf die Anzahl der Elemente unter dem zweiten Hash-Wert (4587 und 1254) zuzugreifen. Die Anzahl dieser Elemente, bei denen approved="1" ist, und die Anzahl der Elemente, bei denen das Datum einen Wert enthält.

Wenn ich über sie iterieren könnte, bin ich sicher, dass ich das, was ich brauche, in eine weniger komplexe Struktur schieben könnte, aber bisher stehe ich auf dem Schlauch.

Ich bin so weit gekommen...

while (my ($id, $surveyhash) = each %{ $htest{'8569'} } ){
    print "$enumid = $subhash\n";
    print Dumper $subhash."\n";
}

Das gibt mir die "4587" und "1254", aber wenn ich versuche, ein Dumper auf $subhash zu machen, bekomme ich einfach....

4587 = ARRAY(0x9a9ffb0)
$VAR1 = 'ARRAY(0x9a9ffb0)
';
1254 = ARRAY(0x9a91788)
$VAR1 = 'ARRAY(0x9a91788)
';

Irgendeine Idee, wie man über diese Monstrosität iterieren kann? Janie

4voto

xpapad Punkte 4326

Ihre Struktur hat Tippfehler, Sie benötigen Kommas zwischen den innersten Hashes und eine Klammer am Ende (anstatt einer geschweiften Klammer)

Nachdem Sie es behoben haben, können Sie etwas wie dies verwenden:

my $genehmigt = 0, my $datum_hat_wert = 0;
while ( my ($k,$vref) = each %htest ) {
    while ( my ($k,$v) = each %$vref ) { 
        # Jetzt sind Sie im inneren Hash, daher wird es 2 Iterationen geben
        # mit $k 4587 und 1254
        foreach my $element (@$v) {
            # Jetzt ist jedes $element eine Referenz auf die innersten Hashes
            $genehmigt++ if $element->{approved} == 1;
            $datum_hat_wert++ if $element->{date};
        }
    }
}

2voto

ardnew Punkte 1880

Hier ist eine ziemlich explizite Iteration, die Ihnen helfen sollte, zu beginnen

my ($num_approved, $num_date) = (0, 0);

# äußere Hashtabelle
while (my ($ka, $va) = each %htest)
{
  # innere Hashtabelle
  while (my ($kb, $vb) = each %{$va})
  {
    # jeden Hashtabelle im Array
    foreach my $h (@{$vb})
    {
      $num_approved += ${$h}{"approved"} == 1;
      $num_date     += length(${$h}{"date"}) > 0;
    }
  }
}

2voto

zgpmax Punkte 2701

Zählen von Übereinstimmungsfällen mit "scalar grep" ist möglich.

my ($genehmigt, $datum_hat_wert) = (0, 0);

for my $v1 (values %htest) {
    for my $v2 (values %$v1) {
        $genehmigt      += scalar grep { $$_{genehmigt} eq '1' } @$v2;
        $datum_hat_wert += scalar grep { $$_{datum} ne '' } @$v2;
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X