Comment puis-je passer une de hachage à la sous-routine?
Besoin d'aide pour comprendre comment faire. Mon code:
my %hash;
$hash{'1'}= {'Make' => 'Toyota','Color' => 'Red',};
$hash{'2'}= {'Make' => 'Ford','Color' => 'Blue',};
$hash{'3'}= {'Make' => 'Honda','Color' => 'Yellow',};
&printInfo(%hash);
sub printInfo{
my (%hash) = %_;
foreach my $key (keys %_{
my $a = $_{$key}{'Make'};
my $b = $_{$key}{'Color'};
print "$a $b\n";
}
}
Vous devez vous connecter pour publier un commentaire.
La voie de la facilité, ce qui peut entraîner des problèmes lorsque le code évolue, est tout simplement en attribuant la valeur par défaut tableau @_ (qui contient toutes les valeurs de clés de paires d'une même liste) à l' %de hachage qui reconstruit ensuite accordingliy. Si votre code devrait ressembler à ceci:
La meilleure façon serait de passer le hash en référence à la sous-routine. De cette façon, vous pouvez toujours passer plus de paramètres à un sous-programme.
Une introduction à l'utilisation des références en Perl peuvent être trouvés dans la perlreftut
my %hash = %{$_[0]};
Vous êtes très, très proche. Il n'y a pas de
%_
pour le passage de la hache, il doit être adopté en@_
. Heureusement, les Hachages sont affectées à l'aide d'un contexte de liste, de sortepermettra de le faire fonctionner!
Également noter que l'utilisation de la
&
en face de la sous-routine d'appel a été, dans la plupart des cas, inutile depuis au moins Perl 5.000. Vous pouvez appeler des sous-programmes de Perl, tout comme dans d'autres langues, ces jours-ci, avec juste le nom et les arguments. (Comme @foule de points dans les commentaires, il y a certains cas où cela est encore nécessaire; voir perlsub à comprendre ce plus, si vous êtes intéressé.)&
est généralement facultative, et il est (souvent) pas recommandé de l'utiliser à cause de la façon dont Perl génère des arguments par défaut, mais il n'est pas obsolète. Parfois, il est nécessaire et parfois, il n'est pas nécessaire, mais il peut encore rendre le code plus lisible.&
était encore généralement nécessaires sur les appels de fonction dans la dernière perl4 version 4.036 de 1993-Févr-05. Croyez-moi, j'étais là. ☺ La seule façon de l'éviter est d'utiliser lesdo mysubname()
de la syntaxe qui fonctionne toujours très bien, par la route, un peu à la surprise de ceux qui tombent sur elle. Ou sur elle.defined
etundef
arguments, ou l'opérande de l' ` \\ ` ougoto
opérateurs. Pour l'invocation, il est utilisé pour contourner prototype de la vérification.&foo()
est bon pour votre@_
, tandis que&foo
sans parens est furtif.goto &foo
peut être plus clair pour la queue de la récursivité, sauf que vous ne pouvez pas ici de là.Je crois que vous voulez
Dans la ligne
printInfo(%hash)
la%hash
est étendu à une liste à l'alternance des paires clé-valeur.Dans
printInfo
, le@_
est cette liste qui, et affecté à%hash
il crée à nouveau les touches avec leur valeur correspondante de l'alternance d'éléments dans la liste.La meilleure façon de passer les hachages et les tableaux est par référence. Une référence est tout simplement une façon de parler d'une structure de données complexe, comme un point de données unique, quelque chose qui peut être stockée dans un variable scalaire (comme
$foo
).Lire sur références, de sorte que vous comprendre comment faire pour créer une référence et de déréférencement une référence dans le but d'obtenir les originaux de vos données.
Les bases: Vous faites précéder votre structure de données avec une barre oblique inverse pour obtenir le référence à cette structure.
Une référence est un emplacement de mémoire de la structure d'origine (plus un indice au sujet de la structure):
Impression sera quelque chose comme:
Pour obtenir la référence de retour dans un format utilisable, il vous suffit de mettre la référence dans la bonne sigil en avant:
Vous devriez en apprendre davantage sur l'utilisation des références depuis c'est la façon dont vous pouvez créer de très complexe de structures de données en Perl, et comment Orientée Objet en Perl fonctionne.
Disons que vous voulez passer trois hachages pour votre sous-routine. Voici les trois hachages:
Je vais créer les références pour eux
Et maintenant, il suffit de passer les références:
Les références sont scalaire de données, donc il n'y a pas de problème de les transmettre à mon sous-routine:
Maintenant, je viens de déréférencement, et mon sous-routine peut les utiliser.
Vous pouvez voir ce qu'est une référence est une référence en utilisant le ref commande:
Ceci est utile si vous voulez vous assurer que vous êtes passé le bon type de structure de données.
Également noter que ce sont les références de mémoire, de sorte que la modification de la référence va modifier l'original de hachage:
Cela peut être bien -- il vous permet de modifier les données transmises à la sous-routine, ou mauvais, il vous permet de involontairement modifier les données transmises à l'origine de la sous-routine.
Vous pouvez les passer comme
do_hash_thing( %hash )
`do_hash_thing( @args_before, \%hash, @args_after )
keys
et d'autres opérateurs de hachage.La liste des œuvres comme:
Cela permet aussi de "flux" de hachage arguments ainsi:
Par des ouvrages de référence comme ceci:
Ici par prototype
(\%@)
. Le prototype fait perl look pour une valeur de hachage dans le premier argument et le passer par référence.Mise en garde: les prototypes ne fonctionnent pas sur les méthodes.
(%)
est de même de la longueur de la liste,(\%)
est de hachage ref