2009-09-10 6 views
0

Ok, alors voici toute la structure que j'essaye de créer. J'ai besoin de créer un tableau anonyme que je peux utiliser comme valeur de hachage. Cela fonctionne dans mon programme:Comment puis-je utiliser un tableau comme valeur de hachage en Perl?

$result = { 
    count, 2, 
    elementList, [ 
     {name => "John Doe", age => 23}, 
     {name => "Jane Doe", age => 24} 
    ] 
}; 

J'essaye de créer exactement la même chose avec le code comme ceci. Cela fonctionne:

my @elements = [ 
    {name => "John Doe", age => 23}, 
    {name => "Jane Doe", age => 24} 
]; 

$result = { 
    count, 2, 
    elementList, @elements 
}; 

Mais cela ne fonctionne pas:

my @elements; 
push(@elements, {name => "John Doe", age => 23}); 
push(@elements, {name => "Jane Doe", age => 24}); 

$result = { 
    count, 2, 
    elementList, @elements 
}; 
+2

Si le reste de votre code rompt avec les parenthèses, le problème est probablement là-bas. Apportez-le dans la question si vous avez également besoin d'aide à ce sujet. –

Répondre

7

Comme d'autres l'ont mentionné, vous décrivez une structure de données inhabituelle: un tableau avec un seul élément, qui est un arrayref de hashrefs. Je suppose que vous voulez vraiment cette structure pour une raison quelconque.

my @elements = [ 
    {name => "John Doe", age => 23}, 
    {name => "Jane Doe", age => 24} 
]; 

est équivalent à

my @elements = []; 
push(@{ $elements[0] }, {name => "John Doe", age => 23}); 
push(@{ $elements[0] }, {name => "Jane Doe", age => 24}); 

parce que vous voulez pousser les hashrefs sur le arrayref dans $elements[0], pas le tableau @elements.

Mais il est inhabituel d'avoir un tableau avec un seul élément. En regardant le code supplémentaire que vous avez posté, ce que vous voulez vraiment est la suivante:

my $elementsRef = []; 
push(@$elementsRef, {name => "John Doe", age => 23}); 
push(@$elementsRef, {name => "Jane Doe", age => 24}); 

Ou ceci:

my @elements; 
push(@elements, {name => "John Doe", age => 23}); 
push(@elements, {name => "Jane Doe", age => 24}); 

puis utilisez \@elements où vous utilisez actuellement @elements.

L'une ou l'autre fonctionnera. C'est à vous de décider lequel vous préférez. J'irais probablement avec la deuxième version.

5

Vous assignez une référence de tableau (la syntaxe []) à votre tableau. En tant que premier et unique élément puisque vous n'en spécifiez aucun autre.

Vous vouliez directement affecter une liste à cet endroit, en utilisant les parenthèses () au lieu des crochets.

Découvrez perldsc pour une introduction sur le sujet.

+0

+1 pour mentionner perldsc –

+0

Les parenthèses sont superflues. Vous pourriez dire @ array =() pour vider un tableau, mais vous n'avez jamais besoin de 'my @ array =()' – runrig

+0

@runrig: Je parlais en fait des parenthèses dans le premier extrait de code, celui où il décrit la structure qu'il veut ... je suis d'accord avec vous sur la création de tableaux. –

3

Mauvais supports.

Vous avez réellement besoin de construire une structure comme celle-ci:

my @elements = (
    {name => "John Doe", age => 23}, 
    {name => "Jane Doe", age => 24} 
); 

Pour le faire dans une boucle, vous devez modifier ce code:

my @elements; # same as my @elements =(); 
push(@elements, {name => "John Doe", age => 23}); 
push(@elements, {name => "Jane Doe", age => 24}); 

La raison en est que les crochets Construire une référence à un tableau. Une référence à un tableau n'est pas la même chose qu'un tableau.

Pour créer une liste d'éléments à affecter à un tableau, utilisez les parenthèses ().

3

[] fait référence à un tableau vide. Vous créez un tableau avec un élément. Dites simplement: my @elements; pour créer un tableau vide.

Questions connexes