Perl Comment puis-je récupérer un tableau à partir d'un hachage de tableaux?

Je suis assez nouveau à Perl, alors pardonnez-moi si cela semble être une question simple...

de toute façon, j'ai un hachage de tableaux et j'essaye de récupérer un des tableaux dans le hachage, mais tout ce que je peux obtenir est la taille scalaire du tableau.

%HoA = a hash of arrays
$key = some key in the hash

foreach $nextItem (@HoA{$key}) {
  do a bunch of stuff with $nextItem
}

quand je fais ceci, $nextItem est toujours juste la taille du tableau et la boucle ne passe qu'une fois. J'ai essayé d'impression suivantes:

@HoA{$key}
$HoA{$key}
@$HoA{$key}

les deux premiers me donnent la taille scalaire et le troisième donne moi rien...ce qui me manque ici?

mise à jour: je me demande si mon problème est en fait la façon dont j'Ajoute les tableaux au hachage. Voici ce que j'ai fais:

@HoA{$key} = split(/ /, $list);

Est-ce que cela colle le tableau dans le hachage, ou la taille du tableau dans le hachage?

Maj 2: J'ai essayé le bloc de code suivant:

my $key = "TEST";
my %HoA = ();
my @testarray = (1, 2, 3);
@HoA{$key} = @testarray;
print Dumper(%HoA);

Voici la sortie:

$VAR1 = 'TEST';
$VAR2 = 1;

Pourquoi est-ce seulement de coller la première valeur du tableau?

16
demandé sur mrplainswalker 2012-09-21 21:35:19

4 réponses

essayez de référencer votre tableau de cette façon:

%HoA = a hash of arrays
$key = some key in the hash

foreach $nextItem (@{$HoA{$key}}) {
  do a bunch of stuff with $nextItem
}

vous prenez la référence du tableau à $HoA{$key} et en faire un tableau.

Edit: Pour votre mise à jour, je pense que vous obtiendrez ce que vous voulez, si vous le faites de cette façon:

@{$HoA{$key}} = split(/ /, $list);

ou vous pouvez le faire

push(@{$HoA{$key}}, split(/ /, $list);

Par exemple:

my $list = "fred joe brown sam";
my %HoA = ();
my $key = "jacob";
@{$HoA{$key} = split(/ /, $list);
foreach my $item (@{$HoA{$key}})
{
    print "Test item: $nextItem\n";
}

You will get:
Test item: fred
Test item: joe
Test item: brown
Test item: sam

Modifier: Ajouter use strict; en haut de votre programme. Fondamentalement, vous essayez d'utiliser HoA comme un tableau lorsque vous avez un hachage défini. Vous êtes référencement du contenu de votre hash incorrect. Pour le faire correctement, vous vraiment, vraiment besoin d'avoir un $ entre le @ et HoA. Perl est sans caractère et vous laissera vous en tirer si vous ne le faites pas!--5-->. extrait de référence d'oreilly pourrait éclaircir quelques points.

my @testarray est un tableau

my %hash est un hachage

$hash{$el1} = \@array est un élément de hachage qui a la valeur d'une référence à un tableau

@{$hash{$el1}} = @array est un élément de hachage qui contient un tableau

14
répondu scrappedcola 2012-09-21 19:22:54

Chaque entrée dans votre hachage est une référence pour un tableau. Par exemple:

$my_hash{$key}

est un référence pour un tableau et pas un tableau. $my_hash{$key} indique simplement une zone dans la mémoire où cette matrice vit. Déréférencer, vous mettez le symbole de tableau en face:

@{ my_hash{$key} }

les Choses deviennent un peu plus poilu lorsque nous parlons des éléments:

${ my_hash{$key} }[0]

est le premier élément de ce tableau. Vous pouvez imaginer si ce tableau composé de hashs à d'autres tableaux, la syntaxe peut obtenir tout à fait obstrude. Heureusement, Perl a une façon propre de le manipuler:

$my_hash{$key}->[0];

c'est exactement la même chose que ci-dessus, mais plus facile à comprendre la syntaxe. Parfois, il est plus facile d'utiliser des variables intermédiaires juste pour que vous puissiez vous référer à des choses sans passer par toutes les déréférenciations:

my %hash_of_array_refs;

foreach my $key (sort keys %hash_of_array_refs) {
    my @array = @{ $hash_of_array_refs{$key} };    #Dereference
    foreach my $element (@array) {                 #Much easier to read and understand
        say "First element is $array[0]";
        say "last element is $array[$#array]";
        say "This element: $element";
    }
}

Sans déférence vous obtenez ceci:

my %hash_of_array_refs;

foreach my $key (sort keys %hash_of_array_refs) {
    foreach my $element (@{ $hash_of_array_refs{$key} } ) {                 #Much easier to read and understand
        say "First element is " . $hash_of_array_refs->[0];
        say "last element is " . $hash_of_array_refs->[$#{ $hash_of_array_refs{key} } ]";
        say "This element: $element";
    }
}
10
répondu David W. 2012-09-21 20:25:40
@array

Est la façon dont vous obtenez le tableau,

@{ $array_ref }

est l'équivalent avec un tableau de référence.

$HoA{$key}

est une référence à un tableau,

@{ $HoA{$key} }

est ce tableau.

for my $nextItem (@{ $HoA{$key} }) 
3
répondu ikegami 2012-09-21 17:40:40

"Pourquoi est-ce seulement de coller la première valeur du tableau?"

vous devez mettre une référence à votre tableau dans le hachage en le préfixant avec un antislash:

$HoA{$key} = \@testarray;

puis quand vous le récupérez à partir du hash vous déréférencez:

@testarray = @{ $HoA{$key} };
0
répondu RobEarl 2012-09-22 16:29:38