2011-12-13 5 views
2

Je commence à apprendre Perl, et j'ai des questions sur le segment suivant de code Perl. Je sais que "my" est utilisé pour définir une variable locale, et "shift" est utilisé pour obtenir l'élément head d'un tableau. Ce qui m'a troublé, c'est de savoir d'où vient le tableau dans le segment de code suivant. En outre, que signifie my @positives = keys %{$lab1->{$cate1}}?problèmes sur un segment de code Perl

preData($cate1, $lab1) 

sub preData 
{ 
    my $cate1 = shift; 
    my $lab1 = shift; 

    my @positives = keys %{$lab1->{$cate1}}; 
} 
+0

double possible (http://stackoverflow.com/questions/296964/what-does-shift-do-in-perl) –

+0

Non, cette question n'est pas à propos de quoi 'shift()' est, il s'agit du déréférencement hashref. L'utilisateur dit savoir à quoi sert shift(). – CanSpice

+0

-1 pour poser deux questions en une seule publication, provoquant des va-et-vient sur les réponses/commentaires qui vont avec quelle question. – tadmc

Répondre

5

$lab1 est une référence de hachage contenant d'autres références de hachage. $cate1 est une sorte de clé de catégorie (je devine).

$lab1->{$cate1} est une référence de hachage. Lorsque vous le dérérez en mettant %{ ... } autour, vous obtenez un hachage. Ce hachage est ensuite passé à la fonction keys(), qui renvoie une liste des clés de ce hachage. Ainsi, @positives est un tableau des clés du hachage référencé par la référence de hachage $lab1->{$cate1}.

Éditer: Lorsque vous traitez avec ces types de structures imbriquées, vous pouvez trouver plus facile de comprendre ce qui se passe en voyant une représentation des données. En haut de votre script, ajoutez use Data::Dumper. Ensuite, entre les my $lab1... et my @positives... lignes, ajouter:

print Dumper($lab1); 
print Dumper($lab1->{$cate1}); 

Et après avoir défini le tableau @positives, ajouter:

print Dumper(\@positives); 

Cela devrait vous permettre de mieux visualiser les données et nous espérons obtenir une meilleure compréhension Structures Perl.

2

Lorsque vous appelez un sous-programme en Perl, les arguments de ce sous-programme lui sont transmis dans le tableau @_. Appeler shift sans aucun paramètre prendra ses arguments du tableau @_. Donc, ce code prend $ cate1 du premier paramètre à preData et $ lab1 du second paramètre à preData.

2

@ désigne un tableau et% désigne un hachage. Donc, cette déclaration:

my @x = keys %y; 

Les moyens prennent la liste des clés du hachage y et les affectent au tableau x. Par exemple, si% y est:

one => 1, 
two => 2, 
three => 3 

Alors @x contiendrait: [? Qu'est-ce changement() en Perl]

one, two, three 
Questions connexes