Question

Je vais essayer d'illustrer cela avec un exemple. Prenons un exemple courant de hachage de hachages:

my %HoH = (
    flintstones => {
        lead => "fred",
        pal  => "barney",
    },
    jetsons => {
        lead      => "george",
        wife      => "jane",
        "his boy" => "elroy",
    },
    simpsons => {
        lead => "homer",
        wife => "marge",
        kid  => "bart",
    },
);

Pour ce qui me concerne, j'aimerais pouvoir ajouter un hash anonyme ou non anonyme à% HOH. Je n'aurai pas besoin (ou ne pourrai pas) définir ces sous-hachages jusqu'à l'exécution. Comment puis-je accomplir cela avec Perl?

Tout ce que j'ai lu (et j'ai déjà lu avec Perldocs et Google) semble donner des exemples de définition de tous les sous-mots (par exemple, "silex", "jetsons" et "simpsons") .

Je tente de créer un hachage parent contenant des sous-hachages avec des lignes d'un fichier CSV:

%TopHash = (
   %Line1 => {
      cell01 => $some_value1a;
      cell02 => $some_value2a;
      cell03 => $some_value3a;
   },
   %Line2 => {
      cell01 => $some_value1b;
      cell02 => $some_value2b;
      cell03 => $some_value3b;
   },
   %Line3 => {
      cell01 => $some_value1c;
      cell02 => $some_value2c;
      cell03 => $some_value3c;
   },
# etc
# etc
# etc

    );

Le nombre de "% LineX " Les hachages dont j'ai besoin ne sont pas connus avant l'exécution (car ils représentent le nombre de lignes d'un fichier CSV lu à l'exécution).

Des idées? Si ce n’est pas déjà clair, j’essaie toujours de comprendre les mots de passe de Perl.

Était-ce utile?

La solution

Vous créez d'abord le hachage à partir de la ligne en cours d'analyse

my %lineHash = (
    cell01 => $some_value1a,
    cell02 => $some_value1b,
    cell03 => $some_value1c
);

ou créez une référence à un hachage purement

my $lineHashRef = {
    cell01 => $some_value2a,
    cell02 => $some_value2b,
    cell03 => $some_value2c
};

Vous l'ajoutez ensuite à votre hachage global, en vous rappelant que les structures Perl imbriquées ne contiennent que des références aux autres structures.

$topHash{line1} = \%lineHash;
$topHash{line2} = $lineHashRef;

mis à jour Exemple donné une boucle sur un tableau de données à analyser

my %topHash;
foreach my $i (0 .. $#data) {
    my %tempHash;
    // stuff here to parse $data[$i] and populate %tempHash
    $topHash{"line$i"} = \%tempHash;
}

Autres conseils

Pour ajouter un hachage anonyme au moment de l'exécution, attribuez-le comme vous le feriez avec un élément de hachage normal:

$HoH{key} = { foo => 42 };

ou

$HoH{key} = $hash_ref;

ou

$HoH{key} = \%hash;
#!/usr/bin/perl

use strict;

my %HoH = (
    line01 => {
        cell01 => "cell0101",
        cell02 => "cell0102",
        cell03 => "cell0103"
    }
);

$HoH{"line02"}    =
    {
        cell01 => "cell0201",
        cell02 => "cell0202",
        cell03 => "cell0203"
    };

foreach my $hohKey (keys %HoH)
{
    my $newHash = $HoH{$hohKey};
    print "Line Name: $hohKey\n";
    foreach my $key (keys %$newHash)
    {
        print "\t$key => ", $newHash->{$key}, "\n";
    }
}

Chaque fois que vous créez un nouveau hachage à partir d'une ligne de données, vous devez penser à une clé unique pour stocker ces données dans votre table de hachage supérieure.

my $line = 1;
my %HoH;
while (<>) {
    my ($cell01, $cell02, $cell03, @etc) = split /,/;
    my $newHash = { cell01 => $cell01, cell02 => $cell02, ... };
    my $key = "line$line";
    $HoH{$key} = $newHash;
    $line++;
}

Maintenant, les touches (% HoH) renverront une liste (non triée) comme "line1", "line2", "line3", ... .
$ HoH {" line5 "}} renverrait une référence aux données de la 5ème ligne de votre fichier.
% {$ HoH {" line7 "}} est une sorte de syntaxe moche mais il retourne une hashtable de vos données de la ligne 7.
$ HoH {"line14"} {{cell02 "}} peut être utilisé pour obtenir une donnée spécifique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top